Schneller Zufallsgenerator



  • weis du jetzt auch was der fehler war? und wie srand arbeitet?
    z.b. http://cplus.kompf.de/artikel/random.html



  • hy there

    nur mal kurz ne frage bezogen auf den link von Dimah

    [...]Was aber, wenn Zufallszahlen in einem kleineren Bereich benötigt werden? Oft sieht man dann, dass einfach nur die niederwertigsten Bits des Ergebnisses von rand() verwendet werden, zum Beispiel durch Einsatz des Modulo-Operators. Diese Praxis ist gefährlich, da das Ergebnis nun keine statistisch gesicherte gleichverteilte Zufallszahlenfolge mehr ist[...]

    kann mir mal jmd erklären warum das so sein soll?

    bye

    marcus



  • Original erstellt von TheTester:
    hy there
    nur mal kurz ne frage bezogen auf den link von Dimah
    kann mir mal jmd erklären warum das so sein soll?
    bye
    marcus

    das ist unfug.
    wenn man nur die niederwertigen bits nimmt, zum beispiel durch einsatz des modulo-ops (oder eben mit &), dann ist alles ok.



  • Danke, es funktioniert jetzt! Ist es etwa so, dass die Funktionen, nachdem ich mit time(0) den "Reset" durchgeführt habe, immer gleich schnell ablaufen und daher immer dieselbe Zahl erscheint? Ich habe den Link gelesen, aber so ist das die einzig logische Erklärung für mich im Moment. Ich hoffe mich kann jemand aufklären, bin noch nicht allzulange dabei. 😉

    zony



  • srand(time(0)) restetted anhand der uhzeit in sekunden. ist also unfug, das innerhalb einer sekunde dauernd zu machen, weil der zufgen immer wieder auf den selben startwert reseted.
    deswegen mache man srand(time(0)) num einmal in der main und fertig.



  • Ist das nicht das, was ich gesagt habe?! 😮

    zony



  • nein. du hast die worte "immer gleich schnell" da reingehudelt. die klingen danach, als hättest du ein ganz falsches bild von rand().



  • Ach übrigens, ich bräuchte noch ne Anregung, wie man diese Zahlen "aneinanderziehen" kann. Ich möchte eine Funktion, welche mir einen String(?) zurückgibt, die mir diese sechs Zahlen zurückgibt, aber durch einen Punkt zusammengezogen. Sozusagen:

    int zusammen()
    {
        int x = rnr().rnr().rnr().rnr().rnr().rnr();
        return x;
    }
    

    Ich weiß, dass 'int' die falsche Deklaration ist und auch, dass die Zuweisung so nicht funktionieren kann, nur hab ich keine Ahnung, wonach ich suchen muss. Kann mir jemand helfen?

    zony



  • Original erstellt von volkard:
    nein. du hast die worte "immer gleich schnell" da reingehudelt. die klingen danach, als hättest du ein ganz falsches bild von rand().

    Ich hab mich vielleicht etwas falsch ausgedrückt, aber im Grunde meinte ich schon dasselbe. 🙂

    zony



  • nimm am einfachsten sprintf dafür.



  • Dank dir! 🕶

    zony



  • Ungeklärt ist leider immernoch der Datentyp, den eine Funktion haben muss, die einen "Text" zurückgibt (falls es da überhaupt einen gibt). Ich habe nun folgende Funktion:

    1: int ausgabe()
    2: {
    3:         char buffer[50];
    4:         int iTmp;
    5:         iTmp = sprintf(buffer, "%d.%d.%d.%d", rnr(), rnr(), rnr(), rnr());
    6:         return buffer;
    7: }
    
    6: warning: return makes integer from pointer without a cast
    6: warning: function returns address of local variable
    

    Es funktioniert zwar, jedoch kommen beim Kompilieren die oben genannten Fehler. Was hat das zu bedeuten? Mein Ziel ist es, die Variable 'buffer' (also die vier zuällig gewählten Zahlen, durch einen Punkt getrennt) in einer anderen Funktion zu verwenden. Danke schonmal.

    zony



  • srand _immer_ nur einmal aufrufen.



  • ich denke an
    void ausgabe(char* text)
    und der, der ausgebe benutzt, legt vorher specher an und läßt ausgabe nur den speicher dann füllen.



  • Texte würd ich so machen:

    Wenn beim Funktionsaufruf schon fest steht wie lang der zurück gegebene string ist dann so:
    char txt[50];
    void FillIt(char* blub);
    FillIt(txt); // schreibt alles in blub rein
    oder wenns nicht feststeht
    char* givemesomthing()
    {
      char* adsd = malloc(irgendwas);
      fill adsd;
      return adsd;
    }
    freigegebn nicht vergessen
    char* blub = givemesomething();
    free(blub);
    


  • maximallänge steht fest.
    6 zahlen à 3 ziffern und 5 punkte und terminator.



  • volkard
    *******

    Original erstellt von TheTester:
    hy there
    nur mal kurz ne frage bezogen auf den link von Dimah
    kann mir mal jmd erklären warum das so sein soll?
    bye
    marcus

    das ist unfug.
    wenn man nur die niederwertigen bits nimmt, zum beispiel durch einsatz des modulo-ops (oder eben mit &), dann ist alles ok

    sprich es ist nicht "gefährlich" den % operator zu verwenden...ja?

    bye

    marcus



  • Original erstellt von TheTester:
    **sprich es ist nicht "gefährlich" den % operator zu verwenden...ja?
    **

    jep ist es nicht!
    schau mal ins Konsolen Forum 😉



  • Original erstellt von TheTester:
    **volkard
    *******
    sprich es ist nicht "gefährlich" den % operator zu verwenden...ja?
    **

    es ganz sicher ist nicht gefährlich, den %-operator zu verwenden, um nur die niederwertigen bits zu benutzen. denn % mit zweirpotenzen (und nur so werden nur die niederwertigen bits benutzt) ist fein und da gibts keine ungleichverteilung.

    im link steht

    Oft sieht man dann, dass einfach nur die niederwertigsten Bits des Ergebnisses von rand() verwendet werden, zum Beispiel durch Einsatz des Modulo-Operators. Diese Praxis ist gefährlich, da das Ergebnis nun keine statistisch gesicherte gleichverteilte Zufallszahlenfolge mehr ist

    und so isses unfug.

    wenn man % aber mit anderen werten verwendet, also wo alle bits benutzt, dann gibts schieflagen in der verteilung. wie schlimm die sind, ist ne andere frage.



  • Und nochmal ein danke meinerseits. 🙂

    zony


Anmelden zum Antworten