Schnell zufallszahlen Generieren



  • Hallo zusammen. Ich habe mich in letzter Zeit etwas umgeschaut im Bereich Zufallszahlengenerierung. Ich bin dann schlussendlich auf einen Algorithmus gestoßen, dem ich ein Minimum und ein Maximum übergeben kann. Eigentlich genau das, was ich gesucht habe. Doch dieser Algorithmus verwendet, wie eigentlich jeder andere den ich kenne die Funktion

    time(NULL)
    

    um zu Seeden.
    Ich habe dann mal in der MSDN nachgeschaut, was es damit auf sich hat. Wie ich dann sah liefert diese Funktion die Zeit im Sekundenabstand. Ich bräuchte diese aber in kürzeren Abständen. Ist dies mit den im C++-Standardumfang enthaltenen Möglichkeiten machbar?

    Kennt jemand eventuell eine andere Möglichkeit, Zufallszahlen zu generieren?
    Kriterien wären folgende:
    > Schnelligkeit
    > Grenzwerte setzen
    > möglichst unterschiedliche Werte sollten erzielt werden

    Ich danke schonmal im Voraus für eventuelle Antworten. 😃



  • Ich bräuchte diese aber in kürzeren Abständen.

    Warum, normalerweise wird der seed nur einmal gesetzt.



  • Seeden mußt Du mit plattformabhängigen Funktionen, wenn Dich das mit dem Sekundenabstand stört. Ansonsten sind srand() und rand() ganz ok.

    Ich bevorzuge rdtsc. Andere getpid mit clock.



  • knivil schrieb:

    Ich bräuchte diese aber in kürzeren Abständen.

    Warum, normalerweise wird der seed nur einmal gesetzt.

    Ich möchte für eine große Menge an x-Werten die dazugehörigen y-Werte generieren.
    Also habe ich eine Funktion geschrieben, die den Seed setzt
    (mit Hilfe von time(NULL)) und mir dann einen zufallsgenerierten y-Wert zurückliefert. Da die Funktion immer wieder aufgerufen wird wird auch immer wieder geseeded und das kostet Zeit, denn ich muss ja zwischen den Aufrufen der Funktion mindestens eine Sekunde "Platz" haben, da sonst der selbe y-Wert nocheinmal zurückgegeben wird.

    Wenn ich etwas falsch gemacht habe, lasse ich mich gerne belehren,
    denn wie man weiß lernt man aus Fehlern ja am besten 😃



  • Man seeded aber nicht bei jedem Aufruf.


  • Mod

    Wie knivil schon gesagt hat, normalerweise wird nur einmal geseedet, also wieso machst du es nicht so?



  • Sorry, Honky, ich war im falschen Film.
    Dachte, Du würdest Dein ganzes Programm mehrmals pro Sekunde aufrufen und es würde Dich stören, daß alle Instanzen, die in der selben Sekunde starten, sich gleich verhalten.

    int main(){
       srand(time(0));//und das war das einzige mal
       //ab jetzt normal weiter
    

    Dann ist alles gut. rand ist dann schnell. Muß nicht auf die teure langsame Uhr zugreifen.
    Und jeder Programmlauf ist ganz anders, solange das Prog nicht zweimal innerhalb einer Sekunde gestartet wird.

    Oft ist die allererste von rand() gelieferte Zahl noch sekündlich aufsteigend. Das macht man weg mit

    int main(){
       srand(time(0));rand();
       //ab jetzt normal weiter
    

    edit: war vertauscht, wie in folgenden Posting geklärt wurde. Habe es repariert.



  • volkard schrieb:

    time(srand(0));//und das war das einzige mal
    

    Da ist dir ein Flüchtigkeitsfehler unterlaufen. Richtig ist

    srand(time(0));
    


  • Ok, danke. Ich wusste nicht, dass nur einmal im gesamten Programm geseeded werden muss. 😃

    Danke für alle hilfreichen Antworten 👍


Log in to reply