Hallo zusammen! Brauche Hilfe in Java, bei einem Programm über Lottozahlen (Zufallszahlen). Danke im Voraus schon mal! ?

...komplette Frage anzeigen

4 Antworten

Echte Zufallszahlen lassen sich auf einem Computer nicht ohne weiters herstellen, denn ohne Beeinflussung von außen kämen bei einem Programm mit jedem Start immer die selben Zahlen raus. Die einfachste Beeinflussung von außen geht über den Timer, denn dieser läuft unabhängig vom Computer. Wird per Tastendruck eine Zeit angefordert, so liefert der Timer eine Zahl, deren niederwertigen Stellen nicht vorhersehbar sind. Durch Division durch eine Primzahl (z.B. 17) bekommt man eine gute Mischung rein, sodass alle Stellen dieser Zahl gleichermaßen unvorhersehbar sind. Benötigt man nun einen bestimmten Bereich, z.B. 1 bis 49, so dividiert man durch 49 und ermittelt den Rest, der zwischen 0 und 48 liegt. Eine 1 dazugezählt ergibt das gewünschte Ergebnis, eine echte Zufallszahl zwischen 1 und 49.

Wird diese Prozedur mehrmals durchlaufen ohne erneuten Tastendruck dazwischen, so ist nur die erste Ziehung eine echte Zufallszahl, die folgenden Ergebnisse sind jeweils vom vorangegangenen abhängig.

Da beim Ziehen der folgenden Zahlen die zu erwartenden Möglichkeiten reduziert werden,  muss der anfänglich festgelegte Bereich jedesmal angepasst werden (1-48, 1-47, 1-46 usw.). Die bereits gezogenen Zahlen müssen nach der Ziehung aus dem Array entfernt werden und die Lücke durch Nachrücken geschlossen werden. So ein Array lässt sich dann auch für eine graphische Anzeige verwenden.

Inwieweit für so ein Lottoziehungssystem überhaupt echte Zufallszahlen notwendig sind, ist schwer vorherzusagen. Ein von der Normalverteilung abweichendes Prinzip wäre erst nach einer relativ großen Menge an Ziehungen mit statistischen Mitteln nachweisbar.

In den Labors von IBM wurden vor Jahren mal Versuche gemacht, aus dem atmosphärischen Rauschen echte Zufallszahlen zu gewinnen.

In Deiner vorgesehenen Untersuchung der Ergebnisse hinsichtlich Häufigkeit sehe ich keinen Sinn. Denn bei guten Zufallszahlen kommen zwangsläufig bei jeder Untersuchung andere Ergebnisse raus. Bei scheinbaren Zufallszahlen bräuchte man Unmengen von Ziehungen, um eine mögliche Unregelmäßigkeit signifikant nachzuweisen.


Keine doppelten Zahlen kommen vor, wenn Du zunächst einen Array füllst mit allen Zahlen von 1 bis 49.

a[i] = i

Danach mischst Du den Array nach bekannten Algorithmen (Donald E. Knuth "The art of Computer Programming" oder hier: http://www.programmieraufgaben.ch/aufgabe/poker-verteilen/i4si4ts5)

danach wählst Du einfach die ersten 6 Zahlen aus. Dabei kommt sicher keine doppelt vor.

Ach du liebe Zeit, wer will das lesen?

Es gibt hier extra eine Funktion im Editor mit der man Quelltext besser darstellen kann.

Das erste Problem ist, dass die Zahlen doppelt vorkommen können, und es auch tun.

Du meinst, so wie du es implementiert hast, kommen die Zahlen doppelt vor, was sie aber eigentlich gar nicht sollen? Oder was ist das Problem?

Mein zweites Problem ist, dass ich den Auftrag habe, angeben zu können welche Zahl wie oft gezogen wurde. Dies bezieht sich darauf, dass wir eine Statistik erstellen sollen, welche Zahl wie oft vorkommt, wenn man 1000-mal die 10 Zahlen ziehen lässt

Wenn ich dich richtig verstehe könntest du z.B. ein Array mit 49 Positionen speichern wie oft jede der Zahlen vorgekommen ist.
D.h. nach jedem Aufruf der Zufallsfunktion addierst du in dem Array an Position x eine 1 , falls x(+1) in den Zufallszahlen vorkam.

maximilianus7 27.08.2015, 14:24

@nutzer131: im GF-editor einen programmcode darzustellen ist praktisch nicht mehr möglich.

bitte programmcode in privatepaste.com o.ä. einstellen.

0
JupStrunk 27.08.2015, 14:36
@maximilianus7

NICHT MEHR MÖGLICH !?!?! :O

wie habe ich denn den Code hier eingeben können ???
seltsam !!!

2
maximilianus7 28.08.2015, 17:16
@JupStrunk

es gibt tastsächlich die eine ausnahme: direkt eintippen.

der normale fragesteller möchte aber seinen code per copy & paste hier einstellen und ohne mühsames nacheditieren geht das nicht.
wenn ich eine grössere menge code absetzen möchte, dann teste ich das vorher und möchte es dann auch kopieren und habe dann dasselbe problem.

dann gibt es auch spezielle schwierigkeiten mit html code da die <...> klammern vom GF-editor interpretiert werden.übrigens ist das bekannt, das wurde schon im forum hinreichend diskutiert. einzige reaktion: vor ca 2 monaten wurde es noch schlimmer.

dazu kommt, dass beim eintippen von längeren text es öfters passiert, dass man zwangsweise ausgeloggt wird und alles ist weg.
auch hier habe mir angewöhnt, ausserhalb zu formulieren.

0

um doppelte Zahlen zu vermeiden, musst Du die schon hezogenen Zahlen durchgehen und checken, ob die neue Zahl schon vorhanden ist...
wenn ja wird solange eine neue generiert, bis nicht... :D

für die Statistik musst Du ein Array für die 49 Zahlen erstellen (Index 0 - 48) und dann das Element mit dem Index der jeweils gezogenen Zahl inkrementieren...
das kann etwas verwirrend sein, weil die Zahlen von 1-49 gehen die Indices aber von 0-48...
dann musst Du entweder von der Zahl jeweils 1 abziehen, oder ein Array mit 50 Elementen erstellen (0-49) und die 0 dann vernachlässigen... :D

JupStrunk 27.08.2015, 14:35

hier mal "eine" Möglichkeit, wie man das realisieren kann...
habe mich auf deinen Code bezogen, sonst hätte ich's wohl etwas anders realisiert... ;)
hoffe, habe da keine Flüchtigkeitsgehler gemacht !!! :D

/** * * Beschreibung * * @version 1.0 vom 21.08.2015 * @author /   
public class ConLotto {
// Anfang
Attribute private static int [] ziehung = new int [6];
Attribute private static int[] statistik = new int[49];
// Ende Attribute
// Anfang Methoden
public static void main(String[] args) {
for (int i=0;i<10 ;i++ ) {
bildeZiehungszahlen();
zeigeZiehungszahlen();
} // end of for
} // end of main

public static void bildeZiehungszahlen () {
  for (int i = 0 ; i < 6 ; i++) {
ziehung [i] = 1+(int)(49Math.random());
// Zahl schon vorhanden?
for(int r = 0; r < i; ++r){
if(ziehung[i] == ziehung[r]{
i--;
break;
}
}
} // end of for

// Statistik erstellen
for(int i = 0 ; i < 6 ; ++i)
++statistik[ziehung[i] - 1];
}
public static void zeigeZiehungszahlen () {
System.out.print (" Ziehung ergab:");
for (int i = 0;i<6 ;i++ ) {
System.out.print(" " + ziehung [i]) ;
} // end of for
System.out.println();
}
public static void anzahlZiehungszahlen () {
System.out.print (" Statistik:\n");
System.out.println();
for(int i = 0 ; i < 49 ; ++i){
System.out.print(" Zahl " + (i + 1) + ": " + statistik[i] + " mal gezogen");
System.out.println();
}
} // Ende Methoden
} // end of class ConLotto
0
JupStrunk 27.08.2015, 22:31
@JupStrunk

LOL, hab' tatsächlich einen kleinenn Flüchtigkeitsfehler gemacht...
hab' vergessen eine Klammer zu schließen !!! :D
(die runde Klammer am Ende der ersten Zeile hier)

if(ziehung[i] == ziehung[r]){          
i--;
break;
}
0

Was möchtest Du wissen?