Mehrere Radom zeitlich verzögern



  • Hallo!

    Ich möchte mehrere Random zeitlich verzögern, da sie sonst
    alle dasselbe Ergebnis liefern.
    Zur Zeit habe ich es so gelöst:

    for (int x = 0; x < 6; x++)
                {
                    rad.Roll();
                }
                for (int x = 0; x < 30; x++)
                {
                    rad2.Roll();
                }
                for (int x = 0; x < 57; x++)
                {
                    rad3.Roll();
                }
    

    Funktionier zwar, find ich aber nicht gut gelöst, geht bestimmt
    besser.

    Hat jemand einen Verbesserungsvorschlag?

    Danke



  • adonis schrieb:

    Ich möchte mehrere Random zeitlich verzögern, da sie sonst
    alle dasselbe Ergebnis liefern.

    Nööö, tun sie nicht. Du solltest bloß davon absehen, jedes Mal einen neuen Zufallsgenerator zu erzeugen.

    var r = new Random();
    foreach (var x in Enumerable.Range(1, 10))
        Console.WriteLine(r.Next());
    


  • Also rad is mein Objekt, 3 hab ich davon, und random steckt in der
    Klasse, also pro erstelltes rad-Objekt, ein erstellter Zufallsgenerator, oder?

    Wenn ich jetzt den Startbutton drücke und nur

    rad.roll()
    rad2.roll()
    rad3.roll()

    schreibe, bekomme ich zu 99% für alle 3 dasselbe Ergebnis,
    meine Vermutung war, dass er Systemzeit dazu abfragt oderso,
    also hatte ich die Schleifen eingbaut, und dann ging es.



  • adonis schrieb:

    Also rad is mein Objekt, 3 hab ich davon, und random steckt in der
    Klasse, also pro erstelltes rad-Objekt, ein erstellter Zufallsgenerator, oder?

    Nein, mach die 'Random'-Instanz 'static', sodass sich alle Objekte Deiner Klasse denselben Zufallsgenerator teilen.



  • Danke, das funktioniert.



  • adonis schrieb:

    schreibe, bekomme ich zu 99% für alle 3 dasselbe Ergebnis,
    meine Vermutung war, dass er Systemzeit dazu abfragt oderso,
    also hatte ich die Schleifen eingbaut, und dann ging es.

    Wer lesen kann ist klar im Vorteil. Regel #1: Wenn man sich mit etwas beschäftigt das man noch nciht kennt, DOKUMENTATION LESEN.

    Was Du benutzt ist ein sogenannten Pseudo-Zufallszahlengenerator.
    (-> http://msdn.microsoft.com/en-us/library/system.random(VS.71).aspx)

    Auf genau der Seite findest Du auch den entscheidenden Hinweis:

    "If the same seed is used repeatedly, the same series of numbers is generated. "

    Das ist auch der Grund warum deine Randoms alle mit dem gleichen Wert starten, eben weil PSeudo-Zufallsgeneratoren GENAU SO funktionieren. Gleiche Seed = Gleiche Zahlenfolge.

    Also entweder eine static instanz benutzen oder wenns unbedingt mehrere INstanzen sein müssen, sicherstellen das sie unterschiedliche Seeds bekommen.



  • Ja, das ist klar, ich war mir nur nicht im Klaren,
    dass ich mit meiner Struktur den selben seed habe.

    Aber sehe nun den Fehler.

    danke euch



  • gleiche Seite in der Doku:

    "By default, the parameterless constructor of the Random class uses the system clock to generate its seed value"

    Soweit ich mich erinnerer hat die System clock eine Auflösung von einer Sekunde, mit anderen Worten, der Seed ändert sich im Sekundentakt. Deine drei Instanzen werden wahrscheinlich aber insgesamt weniger als eine Sekunden brauchen um angelegt zu werden, also kriegen sie alle 3 den gleichen seed.

    Daher auch die Beobachtung das es manchmal nicht der gleiche Wert war, immer dann wenn der Sekundenwechsel genau zwischen zwei Instanziierungen liegt haste "zufällig" unterschiedliche seeds 😉


Anmelden zum Antworten