2016-07-23 9 views
2

Ich möchte ein Array der Größe X mit zufälligen Ganzzahlen von 0 bis X ohne Duplikate füllen. Der Haken ist, ich muss nur Arrays verwenden, um die Sammlungen von int, no ArrayList s zu speichern. Wie gehe ich bei der Implementierung vor?Generieren von Zufallszahlen ohne Duplikate nur mit Arrays

Ich verstehe nicht, warum ich das nicht bekommen kann. Aber das ist mein letzter Code, der die Liste füllt, aber Duplikate erlaubt.

System.out.print("Zero up to but excluding "); 
int limit = scanner.nextInt(); 

// create index the size of the limit 
int [] index = new int[limit]; 

for(int fill=0;fill<limit;fill+=1){ 
    index[fill] = (limit); 
} 

int randomNumber = 0; 
Random rand = new Random(); 
int [] randoms = new int[limit]; 
boolean flag = true; 

// CODE TO NOT PRINT DOUBLES 
for (int z=0;z<limit;z+=1){ 
    randomNumber = rand.nextInt(limit); 
    int i=0; 
    while (i<limit){ 
     if (index[i] == randomNumber){ 
      flag = true; 
     } 
     else { 
      flag = false; 
      break; 
     } 
     i+=1; 
    } 
    if (flag == false){ 
     randoms[z] = randomNumber; 
     index[z] = randomNumber; 
    } 
} 
System.out.println("Randoms: "+java.util.Arrays.toString(randoms)); 
+1

Die Standardmethode hierfür ist die Verwendung einer 'ArrayList', fülle sie mit den Zahlen' 0..X-1' und mische sie dann. Also, mit Arrays, mach dasselbe. –

+0

Related: [Generieren eines Arrays von eindeutigen zufälligen doubles] (http://stackoverflow.com/questions/36119583/generating-a-number-of-unique-doubles-in-java/36119613#36119613) –

Antwort

4

Hier ist eine Möglichkeit, es zu tun:

  1. ein Array der Länge N Erstellen
  2. es von 0 bis N-1 Füllen
  3. Run for-Schleife und Swap zufällig 2 Indizes

Code:

// Step 1 
int N = 10; 
int[] array = new int[N]; 

// Step 2 
for(int i=0; i < N; i++) 
    array[i] = i; 

// Step 3 
for(int i=0; i < N; i++) { 
    int randIndex = (int) (Math.random() * N); 
    int tmp = array[i]; 
    array[i] = array[randIndex]; 
    array[randIndex] = tmp; 
} 
0

Warum das Problem nicht neu formulieren, um ein Array von ganzen Zahlen zu mischen. Füllen Sie das Array zuerst monoton mit den Zahlen 0 bis X. Dann wählen Sie mit der Funktion Random() eine der X-Nummern, die Sie mit der Zahl in Position 0 austauschen möchten. Wiederholen Sie dies so oft Sie möchten. Erledigt.

0

Verwenden Sie ein anderes Array mit Elementen in der Reihenfolge von 0 bis X. Mischen Sie dann mit diesem Array die Elemente um. Wie gehst du vor? Verwenden Sie eine Schleife, um durch jedes einzelne Element des Arrays zu ziehen, und wählen Sie für jede Iteration eine Zufallszahl von 0 bis array.length - 1 und wechseln Sie die Elemente an dem Index, auf dem Sie sich gerade befinden, und am Zufallsindex. Dies ist, wie es wie,

In Ihrem Haupt aussehen würde, würden Sie ein Array, indem Sie diese initialisiert haben,

int[] arr = new int[10];//10 can be interchangeable with any other number 
for(int i = 0; i < arr.length; i++){ 
    arr[i] = i; 
} 
shuffleArray(arr); 

Und die Shuffle-Methode wie folgt aussehen würde,

public int[] shuffleArray(int[] arr){ 
    Random rand = new Random(); 
    for(int i = 0; i < arr.length; i++){ 
     int r = rand.nextInt(arr.length);//generate a random number from 0 to X 
     int k = arr[i]; 
     arr[i] = arr[r]; 
     arr[r] = k; 
    } 
} 
0

Hier ist dein Fehler:

while (i<limit){ 
    if (index[i] == randomNumber){ 
     flag = true; 
    } 
    else {flag = false;break;} <--- rest of the array is skipped 
    i+=1; 
    } 

Nachdem Sie eine neue Nummer generiert haben, fangen Sie an, auf Gleichheit zu prüfen, jedoch auf ce finden Sie, dass randomNumber! = index [i] (sonst Anweisung) brechen Sie aus der while. Sieh dir das an: Das tatsächliche Array ist 3,4,5,1, deine neue Nummer ist 5, du vergleichst es mit 3, nur um herauszufinden, dass sie unterschiedlich sind, also wird Flag auf Falsch gesetzt und es kommt zu einem Ausbruch.

+0

wie kann ich beheben es? –

+0

Entfernen Sie Ihre Pause und setzen Sie sie nach Flag = true if (index [i] == randomNumber) { flag = true; } sonst { flag = false; } – beatrice

+0

das funktioniert nicht ... –

Verwandte Themen