Random Generator

Diskutiere Random Generator im Allgemeine Java-Themen Bereich.
E

EdwinEichhorn

Hallo,

was könnte man tun damit dieser Zufallsgenerator nicht nur eine einzige Zahl ausgibt (für jede Betätigung des Buttons), sondern mehrere verschiedene gleichzeitig. Außerdem sollte er auch keine Nullen ziehen (was er aber tut). Danke für Ratschläge.

Java:
protected void btnButton5ActionPerformed(ActionEvent e)
    {
        
         int[] lottery = new int[6];
            int randomNum = 1;

            for (int i = 0; i < 6; i++) {
                randomNum = (int) (Math.random() * 45); 
                for (int x = 0; x < i; x++) {
                    if (lottery[x] == randomNum) 
                    {
                        randomNum = (int) (Math.random() * 45);
                        x = -1; 
                    }

                }
                lottery[i] = randomNum;
            }

            for (int i = 0; i < lottery.length; i++)
                lblButton.setText(""+randomNum);
 
R

realodds

Du könntest ja zwischen dem generieren noch eine for schleife machen also:
Java:
for (int l = 0; l < anzahlVonRdmZahlen){
    // generiere zahlen
}
Außerdem (mag ich zumindest nicht) solltest du (meiner meinung nach) nicht
Java:
Math.random()
benutzen sondern die Klasse von java.util. Also:
Java:
Random rdm = new Random();
int zahl = rdm.nextInt(45); // wirft eine zahl von 0 - 44 aus
// wenn du keine 0 willst:
int zahl = rdm.nextInt(45) + 1; // wirft eine zahl von 1 - 45 aus
 
MoxxiManagarm

MoxxiManagarm

Ich mag die Stream Variante für diesen Fall, weil man mit distinct ein super Utility dafür hat.

Code:
int[] lottery = ThreadLocalRandom.current().ints(1, 46).distinct().limit(6).toArray();
System.out.println("Lottery numbers: " + Arrays.toString(lottery));
PS.: Kleiner Hinweis - Lotto ist im Original 6 aus 49
 
mihe7

mihe7

@MoxxiManagarm wegen 6 aus 49 :)

@EdwinEichhorn Du kannst Dich dem Problem annähern, indem Du schaust, wie Lotto real funktioniert. Du hast eine Trommel mit z. B. 49 Zahlen (Kugeln). Aus diesen wird nun zufällig eine gezogen, wobei die gezogene Kugel nicht mehr zurück in die Trommel gelegt wird.

Die Trommel mit den 49 Zahlen kannst Du als Array modellieren, das die Zahlen von 1 bis 49 enthält. Wenn Du eine Zahl ziehst, legen wir sie zur Seite, damit wir sie nicht nochmal ziehen. Insgesamt bleiben es aber natürlich 49 verschiedene Zahlen. D. h. wir können z. B. sagen, dass sich am Anfang des Arrays g gezogene Zahlen befinden, während sich 49-g noch nicht gezogene Zahlen anschließen.

Im Code sieht das dann so aus:
Java:
Random zufall = new Random();
int[] zahlen = new int[49];
for (int i = 0; i < zahlen.length; i++) {
    zahlen[i]= i+1;
}

for (int g = 0; g < 6; g++) {
    int index = zufall.nextInt(zahlen.length - g) + g;
    int tmp = zahlen[g];
    zahlen[g] = zahlen[index];
    zahlen[index] = tmp;
}
Der Code läuft in zwei wesentlichen Schritten ab. Der erste Schritt besteht darin, die Lostrommel zu initialisieren. Das bedarf keiner weiteren Erläuterung. Der zweite Schritt ist die Ziehung.

Dazu verwenden wir eine Schleife mit der Laufvariablen g, die angibt, wie viele Zahlen bereits gezogen sind. Zu Beginn ist g 0, da noch keine Zahl gezogen wurde, in der nächsten Iteration 1 usw. Für jedes g ermitteln wir nun eine Zahl, indem wir einen zufälligen Index bestimmen, der die "Position in der Lostrommel" angibt. Wenn wir z. B. 3 Zahlen gezogen haben, dann bleiben noch 49 - 3 = 46 Zahlen in der Trommel. Da die Positionen mit 0 beginnen, brauchen wir eine Zufallszahl zwischen 0 und 46, das erreichen wir mit zufall.nextInt(zahlen.length - g). Da die ersten g Zahlen aber bereits gezogen sind, müssen wir noch g draufzählen. Anschließend vertauschen wir die Zahl an Position g (das ist eine bislang noch nicht gezogen Zahl) mit der Zahl, die sich an der eben zufällig bestimmten Position befindet.

Das wiederholen wir insgesamt sechsmal und schon sind die ersten sechs Zahlen im Array zufällig gezogen.
 
J

JustNobody

Wobei es in der Praxis etwas anders aussieht, so man sich an der Praxis orientieren möchte.

Lotto ist ja so: Man hat die Kugeln (Zahlen) von 1 bis 49.
Dann wirbelt man sie durcheinander und nimmt dann die ersten 6 Stück.

So kann man das auch abbilden. Also Collection mit Zahlen von 1 - 49 füllen. Collections.shuffle aufrufen und dann die ersten 6 Zahlen entnehmen.

Und da dies ja bestimmt eine Übung ist, könnte man hier einfach her gehen und das selbst machen. Wie man sowas mischt, kann man sich überlegen. Ggf. einfach die Elemente durchgehen und für jede einen Tauschpartner ermitteln und die Zahlen tauschen.

Aber es wird dann gleich deutlich, dass dies nicht effektiv ist, denn dann wird 49 mal eine Zufallszahl ermittelt. Bei dem Vorschlag von @mihe7 wird nur 6 mal eine Zufallszahl ermittelt.
 
Thema: 

Random Generator

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben