/ / Generiere eine sich nicht wiederholende Zufallszahl innerhalb des Java-Bereichs - Java, zufällig, nicht wiederholt

Erzeuge nicht wiederholende Zufallszahlen innerhalb des Bereichs in Java - Java, zufällig, nicht-repetitiv

Ich möchte Zufallszahlen im Bereich 1 bis 4, einschließlich 4 erzeugen.
Hier ist mein Code:

int num = r.nextInt(4) + 1;  //r is instance of Random.

Ich führe jedoch den obigen Code in einer Schleife aus und möchte keine Zufallszahlen wiederholen. Was jetzt passiert ist oft ich bekomme:
1,1,1,2,3,1,4,2,2,1,4,2,4,4,2,1,4,3,3,1,4,2,4,1 als meine Ausgabe.

Hier sind die Zahlen zwar zufällig innerhalb des Bereichs (1-4), werden aber häufig wie die Zahl "1" in den ersten 3 Iterationen wiederholt.

Was ich suche, ist ein Weg, um nichts zu bekommenwiederholende Zufallszahl innerhalb der Schleife. Eine einfache Methode, die ich kenne, ist, die letzte Zufallszahl vor dem aktuellen Durchlauf und Vergleich zu behalten, aber ich bin sicher, dass es eine bessere Lösung dafür geben muss.
Danke im Voraus.

Antworten:

6 für die Antwort № 1

Benutzen random.nextInt(range-1) und ordnen Sie diese Nummer dann der Ausgangsnummer mit einer Funktion zu, die die vorherige Nummer ausschließt:

public class Test {
private final Random random = new Random();
private final int range;
private int previous;

Test(int range) { this.range = range; }

int nextRnd() {
if (previous == 0) return previous = random.nextInt(range) + 1;
final int rnd = random.nextInt(range-1) + 1;
return previous = (rnd < previous? rnd : rnd + 1);
}


public static void main(String[] args) {
final Test t = new Test(4);
for (int i = 0; i < 100; i++) System.out.println(t.nextRnd());
}
}

1 für die Antwort № 2

Es gibt keine "bessere" Antwort. Du bekommst eine zufällig Nummer. Überprüfen Sie diese Zeile:

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

Dies könnte vollkommen zufällig sein. Ich schlage vor, Sie beschreiben eine bessere Anforderung. Wollen Sie immer eine nächste Nummer, die sich von der vorherigen unterscheidet? Möchten Sie ein Maximum an Duplikaten in einem speziellen Bereich? sagen wir innerhalb von 6 aufeinanderfolgenden Nummern, jede Nummer darf zweimal vorkommen?

Wenn Sie eine solche Anforderung mitbringen, können wir Ihnen möglicherweise helfen. ansonsten können wir einfach sagen: was du siehst, ist wirklich zufällig :)


1 für die Antwort № 3

Da Sie mehr Zahlen haben, als Sie auswählen müssen, müssen Sie einige Zahlen wiederholen. Sie können nur die Anzahl der sofortigen Wiederholungen minimieren.

Eine Möglichkeit, dies zu tun, ist die Verwendung von Collections.shuffle, mit der Sie Zahlen in zufälliger Reihenfolge ohne Wiederholungen eingeben können, und dies jedes Mal tun. Sie könnten verhindern, dass der letzte N-Wert wiederholt wird.

Um fortlaufende Nummern zu stoppen, können Sie den Bereich verringern und den Modul verwenden.

int n = 0, max = 4;
Random rand = new Random();

for(int i = 0; i < numbers; i++) {
n = (n + rand.nextInt(max-1)) % max;
int numToUse = n + 1;
// use this number.
}

Diese Arbeit gibt es da eigentlich nur max-1 mögliche Werte, da Sie den zuletzt verwendeten Wert ausschließen.


0 für die Antwort № 4

Hier ist ein Algorithmus:

ein Array A [4] mit den Zahlen 1-4 initialisieren einstellenein Zähler Acnt, die effektive Größe von A. Initialisieren Sie auf 4 für i in 1 bis Länge (Ausgabefolge) Wählen Sie eine zufällige ganze Zahl X von 0 bis Acnt -1 Speichern Sie A [X] in Ihrer Ausgabereihenfolge Swap (A [X], A [Acnt - 1]) Acnt-- if (Acnt == 0) Acnt = Länge (A)

Stellen Sie sich vor, A ist eine Tüte Kugeln mit den Zahlen 1-4. Bei jeder Wiederholung Ihrer Schleife entfernen Sie eine Kugel. Anstatt tatsächlich aus dem Array zu löschen, was teuer ist, verstecken Sie einfach den Ball am Ende des Arrays. Wenn Sie die Anzahl der Bälle im Beutel (Acnt) verringern, stammt der nächste von Ihnen ausgewählte Ball von den nicht versteckten Bällen.

Wenn Sie keine Bälle mehr zur Auswahl haben, können Sie die Bälle wieder einblenden, indem Sie die Anzahl der Bälle in Ihrer Tasche auf die volle Anzahl zurücksetzen.

Dies ist grundsätzlich der Standard-Shuffle-Algorithmus.

Bearbeiten: Wenn ich die Frage noch einmal lese, sehe ich, dass er es erlaubtwiederholt sich nach nur einer Zahl anstelle der gesamten Sequenz. In diesem Fall müssen Sie nur ändern, wenn (Acnt == 0) in if (Acnt == Länge (A) - 1) geändert wird.