random



  • man: rand(3), man: srand(3)

    Wobei du da auf die Implementierungsdetails achten solltest, je nachdem wie zufällig die Zahlen sein müssen!



  • nur so ein kleiner Tipp, wenn du wirklich was zufälliges willst,
    versuch mal rand() mit time(0) irgenwie zu verbinden, es geht glaub mir. 😉

    Die Zahlen sind bei weitem zufälliger und die erste Zahl ist auch nicht immer die selbe, das hat mich bei rand() aufgeregt 😞



  • @Searance

    bitte bitte schau dir die links von kingruedi auch nochmal an 😉

    erst srand, dann rand... ohne geht nicht 😉



  • hab mir die links noch nicht genau angeschaut, aber gibt es auch so ne art funktion, wo man als parameter o.ä. ein paar werte vorgibt, und dann zufällig einen dieser werte zurückerhält?



  • warum schreibst du nicht selber so eine funktion? das wäre vielleicht leichter/ schneller für dich, als wenn du immer nachfragst und auf eine antwort warten musst...

    ausserdem finde ich, dass man etwas besser lernt, wenn man es selber geschrieben hat... Stichwort: "Übung macht den Meister!" 🕶



  • Falls das Programm nur auf IA32-Prozessoren (Intel,AMD,Cyrix,Transmeta,etc.) laufen soll, kann man auch folgendes machen:

    int RandomNumber( void ) {
       int c;
       _asm { // manchmal auch asm, __asm
          rdtsc;
          xor eax,edx;
          mov c,eax;
       }
       return c;
    }
    

    RDTSC liest den Taktzaehler des Prozessor aus (64-bit-Wert). Der hier angegebene Code macht eine XOR-Verknuepfung aus dem Hi- und Lo-Wort und gibt das Ergebnis zurueck.

    Ich weiss, das ist eigentlich off-topic im C++ Forum, aber es ist die einzig mir bekannte Moeglichkeit, ohne grossen Aufwand eine Zufallszahl zu erzeugen.

    Portabler geht's auch so:

    #include <stdlib.h>
    #include <time.h>
    // ...
    int RandomNumber( void ) {
       static const int x1 = 0X7F93ABC2;   // die Werte sind im Prinzip wurscht.
       static const int x2 = 0XC37B9A02;
       int ran = ( static_cast<int>( time(0) ) + static_cast<int>( clock() ) - 
          x1 + rand() ) ^ x2; // zum Beispiel, Berechnung ist auch egal
       return ran;
    }
    

    In einer Klasse hat man natuerlich bessere Moeglichkeiten:

    class RandomGenerator {
       int init_seed;
       int buffer;
       public:
       RandomGenerator( void );
       ~RandomGenerator( void );
       int getNumber( void );
    };
    RandomGenerator::RandomGenerator( void )
       : init_seed( static_cast<int>( time(0) ) + static_cast<int>( clock() ) ),
         buffer( 0X7F9ACB30 ) {
       init_seed ^= buffer;
       srand( static_cast<unsigned int>( init_seed ) );
    }
    RandomGenerator::~RandomGenerator( void ) { }
    int RandomGenerator::getNumber( void ) {
       static const int x1 = 0X7F90BC3A;
       static const int x2 = 0XC09A1B57;
       int ran = ( ( x1 + buffer ) ^ x2 ) - rand() - static_cast<int>( time(0) )
          - static_cast<int>( clock() );
       buffer = ( ran + x2 ) ^ x1;
       return ran;
    }
    

    hoffe, das hilft.



  • Kinder Kinder, warum nicht einfach rand nehmen? Man muss doch nicht seine eigene mutlicherweise noch unportable und schlecht wartbare Funktion basteln, wenn man die bereits besitzt. Zur Übung ist das wahrscheinlich gut oder wenn man sich gerade mit dem Thema befasst oder wenn man bessere Zufallszahlen braucht, als die Implementierung mittels rand liefert. Aber das scheint hier ja nicht der Fall zu sein und wenn sollte man sich mit dem Thema nochmals intensiver befassen!

    Mich wundert es, dass in letzter Zeit bei den simplen Fragen, die man mit "Schau dir mal x", x ε Standard-Library beantworten kann, immer noch viele Postings folgen, in denen jemand seine selbstprogrammierte Lösung postet. Das bringt den Fragenden oft nicht weiter oder verschlimmert seine Situation.

    Einfach folgender Code reicht doch

    int random_number(int start,int end) {
      return start+(rand()%end);
    }
    

    noch srand(time(0x0)); am Anfang der Anwendung ausführen und das war es.



  • elise schrieb:

    @Searance

    bitte bitte schau dir die links von kingruedi auch nochmal an 😉

    erst srand, dann rand... ohne geht nicht 😉

    habe srand() nie benutzt und trotzdem schöne Zufallszahlen hingekriegt, gehen tut das auf alle Fälle, nur so ne Frage, wofür wird denn srand() benutzt?



  • Searence schrieb:

    habe srand() nie benutzt und trotzdem schöne Zufallszahlen hingekriegt, gehen tut das auf alle Fälle, nur so ne Frage, wofür wird denn srand() benutzt?

    Damit du nicht bei jedem Programmlauf die gleiche Zufallszahlenreihe bekommst. 🙄
    K



  • ok, danke ich habe es ohne srand() hingekriegt ^^

    naja aber dafür hatte ich auch meinen Lerneffekt dabei *g*

    glaube auch nicht das ich srand() noch brauchen werde

    Ist denke ich mal aber jedem selbst überlassen 🙂


Anmelden zum Antworten