Problem mit Zufallzahlen



  • Hallo,

    Vorneweg: Ich habe bereits das Netz durchforstet, aber leider nichts gefunden was mein Problem gelöst hätte.

    Ziel: Es geht um die Generierung von 100, 1000 oder auch 10000 Zufallszahlen die standardnormalverteilt sind (Polar-Methode).

    Code Snippet:

    for(int j=0; j<=i; j++){
    			while(keeper>1.0){
    				D1Cont = 2*D1->NextDouble()-1.0;
    				D2Cont = 2*D2->NextDouble()-1.0;
    
    		 		keeper= D1Cont*D1Cont + D2Cont*D2Cont;
    
    				}
    		  	 Double3 = Math::Log(keeper)/keeper;
    			 keeper=D1Cont*Math::Sqrt(-2.0*Double3); 
    			 RandomNumbers->Add(keeper);
    		}
    

    Problem: RandomNumbers (eine ArrayList!) enthält im Ergebnis zwei oder drei verschiedene Zufallszahlen, danach ist alles undefiniert. Wenn ich hingegen im Debugger während der Runtime Schritt für schritt der Schleife durchklicke, dann gehts besser.

    Ist NextDouble zeitabhängig und kann deshalb keine neuen Zufallszahlen rauswerfen, weil nicht genügend Millisekunden vergangen sind? Andere Methoden wie rand() oder srand() scheinen auf C++/CLI nicht zu funktionieren.

    Übrigens: Auch wenn ich

    D2 Cont = 2*D1.... ///anstelle des D2 Random-Objekts
    

    schreibe und dadurch nur einen Zufallsgenerator anwerfe, wird's nicht besser.



  • OK - Hab die Lösung gefunden; Drei Stunden gesucht, verzweifelt einen Beitrag geschrieben und 5 Minuten später klingelts.

    Also folgendermaßen:

    Hier wird die Klasse Random erzeugt. Im weiteren Code steht eine Schleife, die die ArrayList gefüllt hat (siehe meinen ersten Beitrag).

    void SNV_Rnd(int i) {
    		System::Random^ D1 = gcnew System::Random;
    ...//weiterer Code }
    

    Stattdessen muss es so aussehen, dass innerhalb einer Schleife die Methode aufgerufen wird und der Rückgabewert die ArrayList füllt. Entscheidend ist wohl, dass der Random-Klasse ein Wert (immer ein anderer?) mitgegeben wird (in meinem Fall der Wert der Schleife).

    System::Double ^SNV_Rnd(int i) {
    	System::Random^ D1 = gcnew System::Random(i);
    ...}
    

    Sry falls sich einer durch meine Selbsttherapie gestört fühlt, aber vielleicht muss sich der Nächste dann nicht solange durch's Netz wühlen. 😉



  • Warum tust Du nicht nur ein Random-Objekt anlegen?



  • Wozu zwei Zufallsgeneratoren? Man kann auch von einem Zufallsgenerator beliebeig oft auf NextDouble zugrefien.

    Die Lösung: keeper vor der While-Scheife zurücksetzen! bzw. eine do-while-Schleife verwenden.



  • Hallo Volkhard und Rhombi,

    das habe ich zwar behoben, war aber nicht die Lösung.

    Problem war die zeitabhängige Generierung von Zufallszahlen. Wenn ->NextDouble() zu schnell durchrattert, dann bekommt man entweder immer die gleiche Zufallszahl oder sogar undefinierte Platzhalter in die ArrayList.

    Deswegen muss offensichtlich ein Startwert bei der Initialisierung des Random-Objekts mitgegeben werden.

    Gruß,

    Goran



  • Goran77 schrieb:

    Hallo Volkhard und Rhombi,

    das habe ich zwar behoben, war aber nicht die Lösung.

    Problem war die zeitabhängige Generierung von Zufallszahlen. Wenn ->NextDouble() zu schnell durchrattert, dann bekommt man entweder immer die gleiche Zufallszahl oder sogar undefinierte Platzhalter in die ArrayList.

    Deswegen muss offensichtlich ein Startwert bei der Initialisierung des Random-Objekts mitgegeben werden.

    Gruß,

    Goran

    Aber warum tust Du nicht nur ein Random-Objekt anlegen?



  • volkard schrieb:

    Aber warum tust Du nicht nur ein Random-Objekt anlegen?

    Habe ich bereits gemacht.



  • Goran77 schrieb:

    volkard schrieb:

    Aber warum tust Du nicht nur ein Random-Objekt anlegen?

    Habe ich bereits gemacht.

    Dann wäre das Problem nicht aufgekommen, weil Du ja unmöglich in einer Sekunde mehrere angelegt haben gehabt könntest.



  • volkard schrieb:

    Goran77 schrieb:

    volkard schrieb:

    Aber warum tust Du nicht nur ein Random-Objekt anlegen?

    Habe ich bereits gemacht.

    Dann wäre das Problem nicht aufgekommen, weil Du ja unmöglich in einer Sekunde mehrere angelegt haben gehabt könntest.

    Wie gesagt - ich hab drei Stunden lang rumprobiert. Deine angesprochene Lösung findet man im Netz durchaus, hat aber auch nichts gebracht. Erst nach der o.g. Umstellung hat es gefunzt.



  • Goran77 schrieb:

    volkard schrieb:

    Goran77 schrieb:

    volkard schrieb:

    Aber warum tust Du nicht nur ein Random-Objekt anlegen?

    Habe ich bereits gemacht.

    Dann wäre das Problem nicht aufgekommen, weil Du ja unmöglich in einer Sekunde mehrere angelegt haben gehabt könntest.

    Wie gesagt - ich hab drei Stunden lang rumprobiert. Deine angesprochene Lösung findet man im Netz durchaus, hat aber auch nichts gebracht. Erst nach der o.g. Umstellung hat es gefunzt.

    Mit nur einem Random-Objekt, als globale Variable/Instanz der Form/lokale Variable der main()/Singleton wäre es schöner gewesen, schneller auch und hätte von Anfang an funktioniert.



  • Ich wage mich kaum zu widersprechen, da du wahrscheinlich viel fitter bist in C++/CLI als ich. Ich werde das heute abend nochmal in Ruhe durchgehen.


Anmelden zum Antworten