Mal wieder Zufallszahl generieren



  • Wenn du es zufälliger willst, dann speicher doch immer wieder mal usereingaben ab (mouse position/klick, wie lang wurde taste gedrückt...). Das schreibst du z.B. in nen Ringpuffer und nimmst dann daraus an einer zufälligen stelle zahlen.



  • wikipedia schrieb:

    Physiker der Purdue Universität haben im Jahre 2005 die ersten 100 Millionen Dezimalstellen von π auf ihre Zufälligkeit hin untersucht und mit kommerziellen Zufallszahlengeneratoren verglichen. Der Forscher Ephraim Fischbach und sein Mitarbeiter Shu-Ju Tu konnten dabei keinerlei verborgene Muster in der Zahl π entdecken. Demnach sei nach Ansicht Fischbachs die Zahl π tatsächlich eine gute Quelle für Zufälligkeit. Allerdings schnitten einige Zufallszahlengeneratoren sogar noch besser als π ab.

    Pi scheint also tatsächlich eine gute quelle für zufallszahlen zu sein, aber ich sehe trotzdem keinen Grund, warum ich es verwenden sollte, denn letztenendes liefert es ja auch nur Pseudozufallszahlen, und wenn die mir ausreichen, kann ich ja auch gleich nur rand() nehmen. Wenn ich aber "wirkliche" Zufallszahlen haben will, reicht mir auch Pi nicht aus, sondern dann würde ich auch die Ubgebungstemperaturen/Benutzereingaben etc. verwenden.



  • Eine Maschine arbeitet immer nur vorgegebene Werte ab. Deswegen gibt es NIEMALS wahre Zufälle.



  • deshalb habe ich ja auch das "wirkliche" in anführungszeichen geschrieben 😉 mit 'wirkliche' meine ich ausreichend gute.



  • Hallo

    Zum Thema Zufallszahlen gibt es auch einen guten Magazinartikel hier im Forum.

    bis bald
    akari



  • Ein Tipp,

    wenn du die Verteilung der Zufallszahlen ändern willst führe einfach eine arithmetische Operation auf einer Menge von Zufallszahlen von rand() aus. Wenn man beispeilsweise die letzten 100 (oder 1000) Zahlen von rand() addiert, nähert man sich einer Normalverteilung.

    Alternativ kann man die letzten X Zufallszahlen multipizieren, dividieren, oder subtrahieren.

    Zufallszahlen sind beispielsweise in der Kryprografie oder Signalverarbeitung interresant. Denn je "zufälliger" ein verschlüsseltes Signal ist, desto eher wird der Schlüssel nicht geknackt. Da das Ganze aber schnell bös mathematisch wird, verweise ich hier einfach mal die Wikipedia. http://de.wikipedia.org/wiki/Pseudozufall. Nur soviel sei noch dazu gesagt, es gibt mathematische Funktionen (man steckt eine Zahl hinein und bekommt eine andere heraus) die durchaus "zufälliger" Natur sind.



  • du könntest auch probieren, ob der compiler deiner wahl schon die neuen random-facilities implementiert 😉

    #include <tr1/random> //zumindest mit g++
    using namespace std;
    
    int main ()
    {
       mt19937 mersenne_twister(time(0));
       uniform_int_distribution<unsigned> random(0, 10); //mit g++: uniform_int<unsigned>
    
       int r = random(mersenne_twister);
    }
    

    PS:
    www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2079.pdf



  • sry wenn ich so dazustoße...
    wie kann ich mit srand ((unsigned)time(NULL)) nen maxwert eingeben?
    Brauche Zufallszahlen zwischen 0 und 1... Vorschlag?
    Danke



  • Xands schrieb:

    sry wenn ich so dazustoße...
    wie kann ich mit srand ((unsigned)time(NULL)) nen maxwert eingeben?
    Brauche Zufallszahlen zwischen 0 und 1... Vorschlag?
    Danke

    Bei srand() initialisierst du nur den Zufallsgenerator - um den Zahlenbereich einzuschränken, mußt du den Rückgabewert von rand() passend zurechtschneiden (Umwandeln in double und Division durch RAND_MAX sollte ausreichen).



  • Kann es sein, dass das Problem des OP lediglich die wiederholte Verwendung von srand ist?!



  • LordJaxom schrieb:

    Kann es sein, dass das Problem des OP lediglich die wiederholte Verwendung von srand ist?!

    Das Hirn will doch noch zufälligere Zahlen generieren.



  • klingt nach ner verflixt guten Sache.

    d.h.:
    ...
    srand ( (unsigned)time (0));
    Variable=rand()%1+0; /*für Zahlen zwischen 0 und 1*/
    ...

    seh ich das richtig?



  • Xands schrieb:

    klingt nach ner verflixt guten Sache.
    d.h.:
    ...
    srand ( (unsigned)time (0));
    Variable=rand()%1+0; /*für Zahlen zwischen 0 und 1*/
    ...
    seh ich das richtig?

    nein.
    damit bekommst du zahlen zwischen 0 und 0.
    also nicht allzu viele 😃

    wenn, dann var = (double)rand()/RAND_MAX
    für 0 <= var <= 1
    🙂



  • Für alle die dies interresiert.

    Manche Zufallsgeneratoren basieren auf mathematische Funktionen, ähnlich der Funktion: f(n+1) = (5 * f(n) + 7) % 11

    Der Seed-Wert könnte man hier als f(0) setzen. Wäre dieser Wert 6, wäre die erste Zufallszahl f(1) = (5 * f(0) + 7) % 11 = (5 * 6 + 7) % 11 = 37 % 11 = 4. Die nächste Zufallszahl wäre dementsprechend f(2) = (5 * f(1) + 7) % 11 = (5 * 4 + 7) % 11 = 27 % 11 = 5.

    Ich hoffe damit ist es ein wenig klarer was ein Seed-Wert sein kann, nämlich der Startwert für die Funktion, welche (Pseudo)Zufallszahlen zurückliefert.


Anmelden zum Antworten