| Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann. |
Diskussion: Lottosimulation im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Zitat: Einfach deine denkweise ändern .. jetzt musst du nur als programmierer denken .. smile versuch doch einfach mal das ...
![]() |
| | #16 (permalink) | |
| Registriert seit: 11.01.08 ![]() Likes: 0 | Zitat:
Ich weiss nur nie wie ich anfangen soll. Aber danke hat mir geholfen ^^ | |
| | |
| | #17 (permalink) |
| Registriert seit: 10.01.08 ![]() Likes: 0 | Hab das Teil mal in C# geschrieben bin aba noch anfänger mein prog stil ist vllt noch net so toll Is aba ohne diese Berechnung der versuche und dieser Chance Code: using System;
namespace Lottotip
{
class MainClass
{
public static void Main(string[] args)
{
ConsoleKeyInfo ci;
Random r= new Random();
int[] zahlen = new int[6];
int tmp,i,zahl,k=0,l=0,ct=0,vs=0,j;
string eng;
int[] lotto = new int[50];
int[] engg = new int[100];
int[] enggg = new int[6];
do{
k=0;l=0;
for(i=0; i<zahlen.Length;i++){
tmp = r.Next(1,49)+1;
if(Array.IndexOf(zahlen, tmp)==-1){
zahlen[i] = tmp;
}
}
Array.Sort(zahlen);
Array.Clear(engg,0,engg.Length);
Array.Clear(lotto,0,lotto.Length);
for(i = 0;i < zahlen.Length;i++){
try{
Console.Write("Geben sie die "+(i+1)+".te Zahl ein:");
eng=Console.ReadLine();
zahl=Convert.ToInt32(eng);
enggg[i]=zahl;
if(Array.IndexOf(engg,zahl)!=-1){
Console.WriteLine("Die Zahl wurde schon eingegeben");
i--;
}
if(zahl<=0 || zahl>=50){
Console.WriteLine("Die zahl muss zwischen 1 und 49 liegen");
i--;
}
foreach(int z1 in zahlen){
if(z1==zahl)lotto[z1]=enggg[i];
}
k++;
engg[k]=zahl;
}
catch(OverflowException){
Console.WriteLine("Die zahl muss zwischen 1 und 49 liegen");
i--;
}
catch(FormatException){
Console.WriteLine("Sie Haben keine Zahl Eingegeben");
i--;
}
}
Array.Sort(enggg);
Console.WriteLine("Die Lotto zahlen sind");
foreach(int z in zahlen)Console.Write(z+" ");
Console.WriteLine("\nDeine Eingabe War");
for(i=0;i<enggg.Length; i++){
Console.Write(enggg[i]+" ");
}
Array.Clear(engg,0,engg.Length);
foreach(int z in enggg){
if(Array.IndexOf(lotto,z)!=-1){
engg[l]=z;
l++;
}
}
Console.WriteLine("\nSie Haben "+l+" Übereinstimmungen");
for(i=0; i< l;i++){
Console.Write("Zahl "+(i+1)+": "+engg[i]+" ");
}
Console.WriteLine("\nWollen sie es noch einmal versuchen ?<j>");
ci=Console.ReadKey(true);
}while(Char.ToUpper(ci.KeyChar)=='J');
}
}
} |
| | |
| | #18 (permalink) |
| Registriert seit: 21.04.08 ![]() Likes: 0 | Hallo! Meine Python Lösung Code: #!/usr/bin/env python2.5
import random
def userNums():
userList = []
while(len(userList) < 6):
num = int(raw_input(("%d. Zahl: " % (len(userList)+1))))
if userList.count(num) > 0:
print "Zahl schon vorhanden!"
elif num < 1 or num > 49:
print "Nur Zahlen zwischen 1 und 49!"
else:
userList.append(int(num))
userList.sort()
return userList
def lottoNums():
lottoList = [ i for i in range(1,50) ]
while(len(lottoList) > 6):
lottoList.remove(random.choice(lottoList))
lottoList.sort()
return lottoList
def evaluate(userList, lottoList):
return filter(lambda x: [ i for i in userList if i==x ], lottoList)
def sixHits(userList):
sixList = []
count = 0
while userList != sixList:
sixList = lottoNums()
count += 1
return count
print "*** LOTTO ***\n*************\n"
print "Geben Sie Ihre sechs Zahlen ein"
userList = userNums()
print "\nDie Lotto-Zahlen wurden gezogen..."
lottoList = lottoNums()
matches = evaluate(userList, lottoList)
print "Gezogene Zahlen: %s " % (lottoList)
print "Ihre Zahlen: %s" % (userList)
print "Sie haben %d Richtige: %s" % ((len(matches)), matches)
print "\nVersuche fuer 6 Richtige werden ausgewertet"
count = sixHits(userList)
print "Sie haetten %d Versuche gebraucht!" % (count)
print "Das entspricht einer Chance von %s%s!" % (1.0/count*100, "%") Felix |
| | |
| | #19 (permalink) |
| Registriert seit: 30.06.08 ![]() Likes: 0 | So hier mal eine Möglichkeit von mir in C#: Ist vlt etwas umständlich geschrieben, die randomnumber Klasse hätte man nicht wirklich extra schreiben müssen aber ich wollt einfach ![]() Output: Code: Bitte geben Sie 6 Nummern zwischen 1 und 49 ein. 1 45 32 2 18 3 Die Nummern währen es gewesen: 13 23 31 32 40 44 Deine Nummern sind diese: 1 2 3 18 32 45 Die folgenden Zahlen sind richtig: 32 Code: using System;
using System.Collections.Generic;
using System.Text;
namespace lotto
{
class randomnumber
{
private int m_Number;
private int m_Min;
private int m_Max;
private Random random = new Random();
public void choicenumber()
{
m_Number = random.Next(m_Min, m_Max);
}
public int number
{
get
{
return m_Number;
}
}
public int min
{
get
{
return m_Min;
}
set
{
m_Min = value;
}
}
public int max
{
get
{
return m_Max;
}
set
{
m_Max = value;
}
}
}
} Code: using System;
using System.Collections.Generic;
using System.Text;
namespace lotto
{
class Program
{
static void Main(string[] args)
{
List<int> r_numbers = getrandomnumbers();
List<int> u_numbers= getusernumbers();
List<int> matches = getmatches(r_numbers, u_numbers);
Console.WriteLine("Die Nummern währen es gewesen:");
WriteTheList(r_numbers);
Console.WriteLine();
Console.WriteLine("Deine Nummern sind diese:");
WriteTheList(u_numbers);
Console.WriteLine();
Console.WriteLine("Die folgenden Zahlen sind richtig:");
if (matches.Count == 0)
{
Console.WriteLine("Keine Treffer");
}
else
{
WriteTheList(matches);
}
Console.Read();
}
private static List<int> getrandomnumbers()
{
List<int> randomnumbers = new List<int>();
for (int i = 0; i < 6; i++)
{
int m_num = getrandomnumber(1, 50);
if (!randomnumbers.Contains(m_num))
{
//Console.WriteLine(m_num);
//Console.WriteLine(i);
//Console.WriteLine();
System.Threading.Thread.Sleep(1);
randomnumbers.Add(m_num);
}
else
{
i--;
}
}
randomnumbers.Sort();
return randomnumbers;
}
private static List<int> getusernumbers()
{
List<int> usernumbers = new List<int>();
Console.WriteLine("Bitte geben Sie 6 Nummern zwischen 1 und 49 ein.");
for (int i = 0; i < 6; i++)
{
try
{
int n = int.Parse(Console.ReadLine());
if (n < 50 && n > 0 && !usernumbers.Contains(n))
{
usernumbers.Add(n);
}
else
{
Console.WriteLine("Bitte geben Sie eine Nummer zwischen 1 und 49 ein. Es darf jede Nummer nur einmal gewählt werden!");
i--;
}
}
catch (FormatException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Bitte geben Sie eine Nummer zwischen 1 und 49 ein!");
i--;
}
}
usernumbers.Sort();
return usernumbers;
}
private static int getrandomnumber(int min, int max)
{
randomnumber number = new randomnumber();
number.min = min;
number.max = max;
number.choicenumber();
return number.number;
}
private static List<int> getmatches(List<int> randomnumbers, List<int> usernumbers)
{
List<int> matches = new List<int>();
foreach(int i in usernumbers)
{
if(randomnumbers.Contains(i))
{
matches.Add(i);
}
}
return matches;
}
private static void WriteTheList(List<int> list)
{
foreach (int i in list)
{
Console.Write(i + " ");
}
Console.WriteLine();
}
}
} |
| | |
| | #20 (permalink) |
| Registriert seit: 31.03.08 ![]() Likes: 0 | Hab auch mal eins in Java gemacht. rar-archiv mit: jar file und .bat datei zum starten |
| | |
| | #21 (permalink) |
| Registriert seit: 22.10.08 ![]() Likes: 0 | Hier meine Lösung: Code: #include <iostream>
using namespace std;
unsigned int leseInteger(void);
void eingabe(unsigned int *);
void generate(unsigned int *);
bool vergleich(unsigned int *, unsigned int *);
int main(void) {
srand(time(NULL));
unsigned int zahlen[6], lotto_zahlen[6];
long int durchlaeufe = 0;
bool volltreffer;
cout << "Lotto Simulation v1.0" << endl << endl;
eingabe(zahlen);
do {
generate(lotto_zahlen);
volltreffer = vergleich(zahlen, lotto_zahlen);
durchlaeufe++;
if(durchlaeufe % 1000000 == 0) {
cout << endl << "Nach " << durchlaeufe/1000000 << " Millionen Durchlaeufen keine Uebereinstimmung" << endl
<< "aktuelle Zahlen: " << lotto_zahlen[0] << " " << lotto_zahlen[1] << " " << lotto_zahlen[2] << " " << lotto_zahlen[3] << " " << lotto_zahlen[4] << " " << lotto_zahlen[5];
}
} while(!volltreffer);
cout << endl << endl << "Nach " << durchlaeufe << " Durchlaeufen gab es einen Sechser" << endl << "aktuelle Zahlen: " << lotto_zahlen[0] << " " << lotto_zahlen[1] << " " << lotto_zahlen[2] << " " << lotto_zahlen[3] << " " << lotto_zahlen[4] << " " << lotto_zahlen[5]
<< endl << "Erfolgschancen: " << (1.0f/durchlaeufe * 100.0) << " %" << endl << endl;
system("pause");
return 0;
}
bool vergleich(unsigned int *zahlen, unsigned int *lotto_zahlen) {
unsigned int treffer = 0;
for(int i=0; i<6; i++) {
for(int j=0; j<6; j++) {
if(*(zahlen+i) == *(lotto_zahlen+j)) {
treffer++;
break;
}
}
}
if(treffer == 6) {
return true;
}
return false;
}
void generate(unsigned int *lotto_zahlen) {
for(int b=0; b<6;b++) {
*(lotto_zahlen+b) = 0;
}
unsigned int gen_zahl;
bool gen_ok;
for(int i=0; i<6; i++) {
do {
gen_ok = true;
gen_zahl = (1+rand()%49);
for(int j=0; j<i; j++) {
if(*(lotto_zahlen+j) == gen_zahl) {
gen_ok = false;
}
}
} while(!gen_ok);
*(lotto_zahlen+i) = gen_zahl;
}
}
void eingabe(unsigned int *zahlen) {
unsigned int zahl_eingabe;
bool eingabe_ok;
for(int i=0; i<6; i++) {
do {
eingabe_ok = true;
cout << i+1 << "te Zahl: ";
zahl_eingabe = leseInteger();
if((zahl_eingabe >= 50) || (zahl_eingabe <= 0)) {
eingabe_ok = false;
cout << "Die Zahl muss zwischen 0 und 50 sein\n";
}
for(int j=0; j<i; j++) {
if(*(zahlen+j) == zahl_eingabe) {
eingabe_ok = false;
cout << "Diese Zahl gab es bereits\n";
}
}
} while(!eingabe_ok);
*(zahlen+i) = zahl_eingabe;
}
}
unsigned int leseInteger(void) {
unsigned int wert;
cin >> wert;
while(cin.fail()) {
cout << "Fehler bei der Eingabe, bitte nochmal: ";
cin.clear();
cin.sync();
cin >> wert;
}
cin.clear();
cin.sync();
return wert;
} |
| | |
| | #22 (permalink) |
| Hier meine Lösung in Ruby: //edit Gerade in bearbeitung wegen nachfolgenden Posts //edit 2 hier die berichtigte Lösung: Code: puts "\n\nGeben Sie nacheinander 6 Zahlen zwischen 1 und 49 ein:\n\n"
a = []; i = 1; k = 0
while i <= 6
k = 0
puts "#{i}. Zahl:"; b = gets.to_i
a.each { |part|
if b == part
k = 1
end
}
if k == 1
puts "Diese Zahl wurde schon einmal genannt"
elsif b > 1 && b < 49
a.push(b); i+= 1
else
puts "Diese Zahl liegt nicht im vorgegebenen Zahlenraum"
end
end
i = 0; j = 1; c = 0; b = []
while a != b
b = []; j = 1
while j <= 6
k = 0; c = (rand(49)+1)
b.each { |part|
if part == c
k = 1
end
}
if k != 1
b.push(c); j += 1
end
end
puts b.join("\n"); puts "------------"; i += 1
end
puts "Nach #{i} Versuchen hat es geklappt! Gewinnchance: 1/#{i}*100=#{(1/i.to_f)*100}" | |
| | |
| | #23 (permalink) |
| Registriert seit: 31.03.08 ![]() Likes: 0 | Ich kenn mich jetzt zwar nicht so mit Ruby aus, aber es sieht aus als ob bei der zufälligen Generierung der Lottozahlen eine Zahl mehrmals vorkommen kann. Also das zB 1,1,1,4,4,5 eine gültige zufällig generierte Lottozahl ist. Weil es gibt ja keine Überprüfung auf doppelte Zahlen bei der zufälligen Generierung, wie oben wo die Zahlen vom Benutzer eingegeben werde, |
| | |
| | #24 (permalink) |
| Hi MrSpider, du hast natürlich recht, da ist mir wohl ein Fehler unterlaufen. Liegt warscheinlich daran, dass ich das Programm kurz vor dem Aufbruch auf eine spontane LAN-Party geschrieben habe *ausrede*. Ich werde es demnächst mal beheben. | |
| | |
| | #25 (permalink) |
| python
__________________ Steinhagelvoll | |
| | |
| | #26 (permalink) |
| Registriert seit: 31.01.09 ![]() Likes: 0 | Ich habe mich auch mal dran gesetzt und was erstellt. Muss dazu sagen das ich noch ziemlicher Anfänger bin und deswegen vielleicht das eine oder andere zu komplizier gemacht habe. (Über Tipps würde ich mich freuen) Ich frage mich jedoch ob das alles so richtig ist. Bei den Ergebnis wie lange man für 6 Richtige bräuchte kommt bei mir meist irgend was so um die 100000-500000 ich dachte eigentlich man bräuchte mehr Ziehungen bis zu 6 Richtigen lotto.h lotto.cpp main.cpp |
| | |
| | #27 (permalink) |
| Registriert seit: 06.04.09 ![]() Likes: 0 | Hm, etwas unschön, aber es sollte funktionieren: Code: # -*- coding: utf-8 -*-
import random
i=0
zae=0
lz=[]
lze=[]
while i<6:
z=raw_input("Bitte Zahl eingeben:")
try:
z=int(z)
if int(z) and z not in lz and 0<z<50:
lz+=[z,]
i+=1
elif not int(z):
print "Bitte eine Zahl eingeben!"
elif z>1 and z>49:
print "Zahl nicht im Bereich von 1-49!"
elif z in lze:
print "Zahl ist schon vorhanden"
else:
print "Du hast einen Fehler provoziert!"
except:
print "EINE ZAHL!!!!!!"
lzg=random.sample(xrange(1,49),6)
lz.sort()
lzg.sort()
#print lz
#print lzg
for u in lz:
if u in lzg:
lze+=[u,]
print str(len(lze)) + " Zahl(en) stimmen überein"
print "Folgende Zahl(en) stimmen überein:",
for i in lze:
print i,
while lz != lzg:
lzg=random.sample(xrange(1,49),6)
lzg.sort()
zae+=1
print "Anzahl der Versuche bis zu den sechs Richtigen:", zae |
| | |
| | #28 (permalink) |
| Registriert seit: 01.07.05 ![]() Likes: 3 | Ada. ![]() Ich habe versucht, es einigermaßen schön hinzubekommen. Ich denke, es ist nicht ganz misslungen. Die Zufallszahlen bei Ada sucken aber auch. Ich habe extra eine kleine Ausgabe am Ende eingebaut. Nach 140 Milliarden Versuchen habe ich auch abgebrochen, ich denke, da kommt nichts mehr. Für 5 Richtige geht aber noch was: (252624, 94748, 54495, 252521, 15794 <= Sieht nach guten Zahlen aus) Deshalb habe ich die Kalkulation der Chance auch gelassen, weil es dazu sowieso nie kommt.
__________________ The only true thing about religion is that it's false. |
| | |
| | #29 (permalink) |
| Habe das ganze mal in Perl geschrieben... time perl random.pl 42 24 5 18 37 9 Run 2, new Max: 1 Run 7, new Max: 3 Run 1965, new Max: 4 Run 39841, new Max: 5 Run 30886889, new Max: 6 Finished after 30886889 Runs real 7m18.662s user 6m51.560s sys 0m2.970s time perl random.pl 42 24 5 18 37 9 Run 1, new Max: 1 Run 4, new Max: 2 Run 130, new Max: 3 Run 3085, new Max: 4 Run 61583, new Max: 5 Run 13636092, new Max: 6 Finished after 13636092 Runs real 3m13.131s user 3m1.370s sys 0m1.250s A Perl Solution | |
| | |
| | #30 (permalink) |
| Registriert seit: 31.10.10 ![]() Likes: 0 | Hey Leute ich bin ganz neu hier und lerne auch erst seit kurzem Programmieren... Also ich bringe mir Java selbst bei, brauch ich für die Schule und das seit 2 Monaten, wobei ich selten lerne Also hier mein Versuch das ganze mit Java zu machen, sicherlich ncoh zu umständlich und auch nicht komplett aber ich bin froh das ich es geschafft habe mein 1. Programm in java zu schreiben ![]() Code: import java.io.*;
public class LottoSimulation
{
public static void main (String[] args)
{
System.out.println("Willkommen bei Lotto Simulation >>6 aus 49<<");
int tipp[] = new int [6];
int richtig = 0; // wird für Übereinstimmung benötigt
for (int i=0; i<6; i++)
{
tipp[i] = gettipp(i);
for(int j=0; j<i; j++)
{
if(tipp[i]==tipp[j]){
System.out.println("Sie haben diese Zahl bereits getippt!");
i--;
break;
}
}
}
int ergebnis[] = new int [6];
System.out.println("Die Lottoziehung ergab folgendes Ergebnis: ");
for (int i=0; i<6; i++)
{
ergebnis[i] = ziehung();
for (int j=0; j<i; j++)
{
if (ergebnis[i]==ergebnis[j] || ergebnis[i]==0)
{
i--;
break;
}
}
System.out.println(ergebnis[i]);
}
// Lottotipp wird auf Übereinstimmung getestet:
for(int i=0; i<6; i++)
{
for(int j=0; j<6; j++)
{
if (tipp[i]==ergebnis[j]){
richtig = richtig + 1;
}
}
}
System.out.println(" Sie haben "+richtig+" richtige!");
if(richtig >= 3){
System.out.println("Herzlichen Glückwunsch, Sie hätten gewonnen");
}else{
System.out.println("Mein Beileid, Sie hätten nichts gewonnen");
}
}
public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public static int gettipp(int i)
{
int a = 0;
int b = 0;
double Tipp = 0;
double tipp = 0;
while (a==0)
{
Tipp = 0;
System.out.println("Bitte tippen Sie Ihre "+ (i+1) +". Lottozahl: ");
String number = new String();
try{
number = in.readLine();
}
catch(IOException e)
{
System.out.println("Fehler");
}
try{
tipp = Double.valueOf(number).doubleValue();
Tipp = tipp;
}
catch(Exception e)
{
System.out.println("Fehler! Sie haben keine akzeptable oder eine Komma-Zahl eingegeben");
continue;
}
if (!(1 <= Tipp && Tipp <= 49)) { // ! heißt nicht
System.out.println("Ihre "+ i +". Lottozahl war nicht im Bereich 1-49");
}
else{
a=1;
}
}
return (int)tipp;
}
public static int ziehung()
{
double zufall = 0;
int x = 0;
zufall = Math.random()*49;
zufall = Math.round( zufall );
x = (int)zufall;
return x;
}
} Bin mir nicht sicher ob ich was an der Wahrscheinlichkeit gepfuscht habe?! Ich glaube 1 und 49 sind unwahrscheinlicher als 2-48 kann das sein? (wegen der rundung bekommen sie ja weniger chance ) Kritik Ist SEHR erwünscht PS: hab 5 Stunden gebraucht wie gesagt erstes Programm Geändert von EgoBolle (01.11.10 um 00:01 Uhr) Grund: Entgültiger Code |
| | |
![]() |
| | |
| |
| Themen-Optionen | |
| Ansicht | |
| |