2012-04-12 13 views
0

Mögliche Duplizieren:
why do i always get the same sequence of random numbers with rand()?Warum bekomme ich immer dieselben zufälligen Werte?

Ich bin von der Tatsache verwechselt, dass selbst mit verschiedenen Programmen (auf der gleichen Maschine) zu laufen/kompilieren, und nachdem die vaues nilling (vor und nach) der Funktion .., die egal ist WAS .. Ich werde weiterhin die gleichen "zufällige" Zahlen ... jedes Mal, wenn ich es laufen. Ich schwöre das ist nicht, wie es sollte arbeiten .. Ich werde so einfach zu veranschaulichen, wie möglich ...

#import <Foundation/Foundation.h> 
int main(int argc, char *argv[]) { 

    int rPrimitive = 0; rPrimitive = 1 + rand() % 50; 
    NSNumber *rObject = nil; rObject = [NSNumber numberWithInt:rand() % 10]; 
    NSLog(@"%i %@", rPrimitive, rObject); 

    rPrimitive = 0; rObject = nil; 
    NSLog(@"%i %@", rPrimitive, rObject); 
    return 0;   
} 

Run in Textmate:

i686-apple-darwin11-llvm-gcc-4.2 
8 9 
0 (null) 

Run es in Coderunner:

i686-apple-darwin11-llvm-gcc-4.2 
8 9 
0 (null) 

Führen Sie es eine Million Mal, wenn Sie möchten. Sie können sagen, was es immer sein wird. Warum passiert das? Warum oh warum ist das "wie es ist"? Diese

+0

Meine Frage hatte wirklich mehr zu tun mit der Tatsache, dass diese Ergebnisse sich über logische Unterteilungen des OS/Arbeitsspeichers erstrecken und dass sie auftreten, obwohl den Werten Null zugewiesen wird, als zu "rand". –

+2

@alexgray Das bedeutet nur, dass die verschiedenen Betriebssysteme denselben PRNG verwenden, was nicht unerwartet ist.Das Setzen von Nullen ändert nichts, da dies das erwartete Verhalten von 'rand' und nicht ein Speicherfehler ist. –

+0

Entfernen Sie den automatisch generierten doppelten Link bitte nicht. Sie können diese Frage für die Aufmerksamkeit des Moderators markieren oder das Problem auf [Meta.SE] ansprechen, wenn Sie der Meinung sind, dass es erneut geöffnet werden sollte. –

Antwort

6

Grund (von der rand Manpage):

If no seed value is provided, the rand() function is automatically 
    seeded with a value of 1. 

Da es immer mit der gleichen Anzahl ausgesät wird, wird es die gleiche Zahlenfolge immer produzieren. Damit es bei jeder Ausführung eine andere Sequenz erzeugt, müssen Sie jedes Mal, wenn es ausgeführt wird, einen anderen Seed verwenden. Sie können srand() verwenden, um den Seed festzulegen.

+2

Beachten Sie, dass das gemeinsame Muster "srand (time (NULL))" ist, so dass aufeinanderfolgende Läufe des Programms unterschiedliche Seeds erhalten. –

3

Da die Zahlen nicht zufällig sind, sind sie pseudorandom. Sie werden nach einem Algorithmus generiert, der bei gleichem Anfangswert immer die gleiche Ausgabe liefert. Sie seeden den PRNG nicht, also verwendet er einen standardmäßigen, konstanten Seed.

Wenn Sie den PRNG mit etwas weniger vorhersagbarem (wie der aktuellen Zeit und/oder PID) verwenden, erhalten Sie jedes Mal andere Ergebnisse. Im Fall von rand(3) müssen Sie es mit srand(3) säen.

2

Der Grund ist es so ist, weil rand ein Pseudo-Zufallszahlengenerator ist, was bedeutet, es ist nicht wahr Zufallszahl generiert (was eigentlich eine sehr schwierige Sache zu tun ist). Er generiert die nächste Nummer in der Sequenz mit dem “ Seed ”, und zu Beginn der Ausführung wird der Seed immer auf den gleichen Wert (1 oder so) gesetzt, also wenn Sie den Seed nicht ändern, werden Sie immer erhalten die gleiche Folge von Zufallszahlen. Sie können etwas wie srand(time(NULL)); verwenden, um den Zufallszahlengenerator basierend auf der Zeit zu säen, oder Sie können einen Zufallszahlengenerator verwenden, der für kryptografische Zwecke als stark genug erachtet wird, arc4random.

Sie könnten thing “ warum ist es so? ”, aber es gibt einige Fälle, in denen Sie die gleiche Reihe von “ Zufallszahlen ” mehrmals generieren möchten.

+0

Ahh, ja, ich hatte vorher arc4random benutzt, weshalb das so merkwürdig erschien. In der Tat platzierte '#define rand() (arc4random()% ((unsigned) RAND_MAX + 1)) bevor es dem Universum Sinn brachte , nochmal. Vielen Dank. –

+1

In einer deterministischen Maschine (auch Computer genannt) ist das "Erzeugen" echter Zufallszahlen unmöglich, nicht schwierig. Sie brauchen eine äußere Quelle der Zufälligkeit. –

+0

@alexgray, auch wenn Sie dies tun, verwenden Sie immer noch Pseudozufallszahlen, es passiert einfach, dass arc4random selbst mit etwas einzigartiger als der konstante Wert '1' – tobyodavies

Verwandte Themen