Trotz Abfrage immer noch Zahlen doppelt

Status
Nicht offen für weitere Antworten.

Griffin

Bekanntes Mitglied
Ich fülle mein Array mit Zufallszahlen, dabei ist es wichtig, dass jede Zufallszahl nur einmal dran kommt. Nun hab ich, mit Hilfe von einigen Personen aus diesem Forum folgenden Kontrollmechanismus erstellt:
Code:
//Die Methode holeZZ() generiert eine Zufallszahl
for (int i = 0; i < intgesam.length; i++) {
	intgesam[i] = holeZZ(); // A
	for (int j = 0; j < intgesam.length; j++) {
		if (intgesam[i] == intgesam[j] && i != j) { // B
			intgesam[i] = holeZZ(); // C
			j = 0; // D
		}
	}
}
So. Jetzt prüft er jede generierte Zahl die bei A entsteht unter B. Falls die Zahl doppelt ist wird eine neue erstellt (C) und die Suche wird von neu gestartet (D).
So weit so gut. Doch da ist ein kleiner Fehler drin, sodass es trotzdem zu doppelten Zahlen kommt. Wenn man nun 20 Zahlen generiert die jewals von 1-20 reichen, müsste jede Zahl nur einmal vorkommen. Leider kommt bei 10 maligem Aufrufen dieses Algorithmus mindestens 50% mit doppelten Zahlen.
Aber wenn ich um die innere Schleife noch eine Schleife bis ca 5 laufen lasse, habe ich keine doppelten Werte mehr. Aber dafür auch mehr rechen Arbeit, die ich gerne vermeiden würde.
 
Das resultiert darus, dass du beim zweiten hohleZZ keine Ueberprüfung mehr stattfindet...
 
ich würde das so machen:
Code:
import java.util.*;

public class RandomNumberGenerator
{
	private int amount;
	private final static byte MAX = 20;
	public RandomNumberGenerator(int amount)
	{
		this.amount = amount;
	}
	
	public HashSet getRandomNumbers()
	{
		HashSet numbers = new HashSet();
		Random rand = new Random();
		
		for (int i =0; i <= amount; i++)
		{
			while ( numbers.add(new Integer( rand.nextInt(RandomNumberGenerator.MAX))))
			{
				numbers.add(new Integer( rand.nextInt(RandomNumberGenerator.MAX)));
			}
		}
		return numbers;
	}
	
	public static void main(String[] args)
	{
		Iterator it = new RandomNumberGenerator(20).getRandomNumbers().iterator();		
		while (it.hasNext())
		{
			System.out.println( it.next() );
		}
	}
}
 
@ meez
Das j = 0 bewirkt die überprüfung für die neue Zahl.

@foobar

Danke für den Code. Ich schau mal wie ich ihn einbinden kann.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben