Schneller Zufallsgenerator



  • 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



  • Original erstellt von zony:
    **```cpp
    1: int ausgabe(){
    ...
    6: return buffer;
    ...
    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?**
    

    Du hast eine Funktion, die ein int zurückgeben soll, du lässt aber in Zeile 6 einen char*-Wert zurückgeben. Das geht so natürlich nicht...



  • Original erstellt von 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**

    Die Fehlermeldung is logisch, weil deine Funktion als int deklariert wurde du aber einen Pointer auf ein Char-array zurückgibst.
    Was außerdem sowieso tötlich ist weil du das char Feld in der Funktion deklarierst, also wenn du den Pointer nachher verwenden würdest, würde dein Programm abstürtzen, weil das Array gar nbicht mehr existiert, also entweder das Feld static machen opder zB. so;

    bool ausgabe(char * Ergebnis)

    {
    Erbenis = new char[50];
    etc...

    return false; //wenn funktion erflogreich
    return true; // Wenn Fehler, zb kein Speicher(new)
    }



  • Original erstellt von 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:

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

    **

    Hi!

    Ich denke mal, dass das so nicht klappen wird. 🙂

    Du hast als Rückgabewert einen Integer deklariert, gibst aber tatsächlich ein CHAR-Array zurück. Daher auch die warnung.

    [cpp] char* ausgabe(void) [/cpp]

    Damit sollte es klappen 😉



  • verdammt.
    meint ihr, ich sage void ausgabe(char* buf); nur um euch zu ärgern?



  • void ausgabe(char* buffer)
    {
      sprintf(buffer, "%d.%d.%d.%d", rnr(), rnr(), rnr(), rnr());
    }
    

Anmelden zum Antworten