Zufallszahlen nicht doppelt vorkommen lassen



  • Ja wie die überschrift schon sagt, wie schaffe ich es das meine Zufallszahlen in einen Array nicht doppelt vorkommt? 😕

    Das brauch ich um ein Lottospiel zu machen 😃 (Bei der ziehung)



  • Durch die bislang vorhandenen Ergebnisse iterieren und prüfen, ob die aktuell "gezogene" Zahl dort vorhanden ist; wenn ja, Durchgang wiederholen.

    Oder du füllst zuerst ein Array mit den möglichen Lottozahlen. Nach der Ziehung einer Zahl füllst du deren Platz im Array mit einem Sonderzeichen (z.B. 0). Bei der Ziehung prüfst du dann, ob das Ergebnis 0 ist und wiederholst gegebenenfalls.



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.





  • Jansen schrieb:

    Durch die bislang vorhandenen Ergebnisse iterieren und prüfen, ob die aktuell "gezogene" Zahl dort vorhanden ist; wenn ja, Durchgang wiederholen.

    Oder du füllst zuerst ein Array mit den möglichen Lottozahlen. Nach der Ziehung einer Zahl füllst du deren Platz im Array mit einem Sonderzeichen (z.B. 0). Bei der Ziehung prüfst du dann, ob das Ergebnis 0 ist und wiederholst gegebenenfalls.

    beides schrecklich ineffektiv.. Wenn du erst ein (tmp)Array mit den möglichen Lottozahlen anlegst (wie beim 2. Vorschlag), kannste dir das wiederholen auch ganz sparen. So kannste einfach bei der i-ten Ziehung eine Zufallszahl r zwischen 0 und (tmpArraySize - i - 1) erzeugen und dann diese dazu nutzen aus dem tmpArray den entsprechenden Eintrag zu holen (also wertZiehungI = tmpArray[r]). Damit du Zahl nun nicht nochmal gezogen wird, überschreibste einfach den Wert an der r-ten Stelle im tmpArray mit dem Wert der (tmpArraySize-i-1)-ten Stelle im tmpArray (also tmpArray[r] = tmpArray[tmpArraySize-i-1]).

    Also im Ganzen könnte das dann etwa so aussehen:

    /**
    	 * Konstruiert ein Array der Größe n. Weiter befüllt es das Array mit Zufallswerten
    	 * zwischen 0-49, die paarweise verschieden sind.
    	 * @param n Größe des zu erzeugenden Arrays
    	 * @return Array
    	 */
    	public static int[] constructArray49(int n) {
    		if(n < 1 || n > 49)
    			throw new IllegalArgumentException("n muss zwischen 1 und 49 liegen!");
    
    		int[] returnArray = new int[n];
    		int[] numberPool = new int[49];
    		//numberPool mit zahlen von 1 bis 49 initialisiern
    		for(int i = 0; i < 49; ++i) {
    			numberPool[i] = i+1;
    		}
    
    		for(int j = 0; j < n; ++j) {
    			//Zufallszahl zwischen 0 - (48-j) erzeugen
    			int random = (int)(Math.random()*(48-j));
    			//Entspreche Zahl aus dem Numberpool holen
    			returnArray[j] = numberPool[random];
    			//gezoge Zahl aus dem numberPool entfernen
    			numberPool[random] = numberPool[48-j];			
    		}
    
    		return returnArray;
    	}
    

Anmelden zum Antworten