Wie lautet der Programmcode um bei einem Java Programm gleiche Zahlen zu vermeiden?

5 Antworten

Denke das ich die optimale Lösung gefunden habe^^

Du erstellt ne Zufallszahl und wenn die nicht schon in der Liste existiert wird die Ausgegeben und der Liste hinzugefügt, existiert sie schon wird einfach ne neue Zufallszahl erstellt.

import java.util.ArrayList;
import java.util.Random;

public class main {

    public static void main(String[] args) {
        ArrayList<Integer> numberList = new ArrayList<Integer>();
        Random r = new Random();
        int counter = 0;
        int testNumber = 0;

        while (counter < 10) {
            testNumber = r.nextInt(15);

            if (numberList.contains(testNumber) == false) {
                System.out.printf("%d\n", testNumber);
                counter++;
                numberList.add(testNumber);
            }

        }

    }

}


Du erstellst zwei Arrays, das erste hat deine Zahlen (1,2,3) das dritte boolean werte (true,true,true).

Mit Random greifst du dann auf eine zufällige Stelle zu. Wenn im boolean Array der wert true steht, wird der Zahlenwert ausgegeben und die Position im boolean Array auf false gesetzt. Steht im boolean Array False wird eine neue Zufallszahl generiert.

Also:

(1,2,3) - (true,true,true)

Der Random Generator liefert den Wert 1, also wird die Zahl zwei ausgegeben und die zweite Stelle im boolean Array auf false gesetzt:

(1,2,3) - (true,false,true).

Kommt wieder die 1 beim Zufallsgenerator raus, steht da ja false, also wird eine neue Zufallszahl generiert usw...

Wäre es nicht einfacher (und effizienter) jede Zufallszahl in ein Array zu stecken und vor dem weiterarbeiten zu prüfen ob es nicht schon im Array exestiert?

0
Lineare Kongruenzmethode
      long x0 =            1;
      long a  =           11;
      long b  =           13;
      long m  = 2_000_000_011;
      long x  = (a * x0 + b) % m;

      while(x != 1) {
         tuEtwasMit(x);
         x = (a * x + b) % m;
      }

Ich schlage Dir die lineare Kongruenzmethode vor. Hier erhältst Du 2'000'000'010 verschiedene Pseudozufallszahlen. Erst danach wiederholt sich die Sequenz. Du kannst auch mit anderen a, b und m ausprobieren. Etwas schnelleres wirst Du kaum finden.

Shuffle

Eine andere Variante ist es, ein Array mit allen möglichen Zahlen aufzufüllen (0, 1, 2, ...., n) und danach zu mischen (shuffle). Danach kannst du einfach jede Zahl aus dem Arrya nehmen und bist sicher, dass keine zweimal genommen wurde. Ein weiterer Vorteil der Shuffle-Methode: Du kannst vorab bestimmen, welche Zahlen vorkommen sollten und sogar allfällig aufzutretende Duplikate festlegen.

Du kannst eine Liste machen und dann mit .contains() checken, ob eine Zahl schon vorhanden ist.

int a = 7; //Oder: Zahl deiner Wahl, in diesem Fall 7.
for (int i=0; i<20; i++) //Oder: Wie oft du 'würfeln' willst, in diesem Fall 20 mal.
{
int b = (int)(Math.random()*(100)); //Oder: In welchem Bereich du Zahlen generieren willst, in diesem Fall 0-100.
if (a==b){
System.out.println("Yay!"); //Oder: Was du machen willst, wenn die beiden Zahlen übereinstimmen, in diesem Fall 'Yay!' in die Konsole schreiben.
}
}

Dies würde funktionieren, falls du eine feste Zahl hast und dann x Zufallszahlen generierst und schaust ob eine mit deiner Zahl übereinstimmt.

Woher ich das weiß:Berufserfahrung – Programmierer

Oder aber als Methode:

public static void main(String gutefrage[])
{
		zufallszahlÜberprüfungsmethode(7); //Oder: Zahl deiner Wahl, in diesem Fall 7.
}

private static void zufallszahlÜberprüfungsmethode(int a)
{
		for (int i = 0; i < 20; i++) //Oder: Wie oft du 'würfeln' willst, in diesem Fall 20 mal.
{
			int b = (int) (Math.random() * (100)); //Oder: In welchem Bereich du Zahlen generieren willst, in diesem Fall 0-100.
			if (a == b)
{
				System.out.println("Yay!"); //Oder: Was du machen willst, wenn die beiden Zahlen übereinstimmen, in diesem Fall 'Yay!' in die Konsole schreiben.
}
}
}

0