mit rand, um eine Zufallszahl zu generieren

8

gcc 4.4.4 c89

Ich verwende den folgenden Code. Allerdings bekomme ich immer die gleiche Nummer:

%Vor%

Ich möchte 0 bis 30 zurückgeben. Aber das letzte Mal, als ich das gemacht habe, habe ich drei Mal dreizehn bekommen.

Vielen Dank,

    
ant2009 01.07.2010, 16:13
quelle

6 Antworten

22

Sie säen innerhalb der Schleife (mit demselben Wert wegen der Geschwindigkeit, mit der die Schleife ausgeführt wird), wodurch die generierte Zufallszahl jedes Mal gleich ist.

Sie müssen Ihre Seed-Funktion außerhalb der Schleife verschieben:

%Vor%     
Mark Rushakoff 01.07.2010, 16:15
quelle
9

Sie müssen srand nur einmal am Anfang Ihres Programms aufrufen.

srand initialisiert den Pseudozufallszahlengenerator mit der Zeit in Sekunden. Wenn Sie es mit einer bestimmten Nummer initialisieren, erhalten Sie immer die gleiche Zahlenfolge. Deshalb möchten Sie es normalerweise am Anfang mit der Zeit initialisieren (so dass der Startwert jedes Mal anders ist, wenn Sie das Programm ausführen) und dann nur rand verwenden, um Zahlen zu erzeugen, die zufällig erscheinen.

In Ihrem Fall ändert sich die Zeit nicht von Iteration zu Iteration, da die Auflösung nur 1 Sekunde beträgt. Sie erhalten also immer die erste Zahl der Pseudozufallsfolge, die immer die gleiche ist.

    
Michał Trybus 01.07.2010 16:15
quelle
4

Sie müssen srand((unsigned int)time(NULL)) nur einmal vor der Schleife eingeben.

    
Sergei Kurenkov 01.07.2010 16:16
quelle
2

Es ist durchaus möglich, dass die 3 mal 17 immer noch völlig zufällig sind.

Es besteht eine Wahrscheinlichkeit von etwa 1: 10, dass zwei Zahlen gleich sind, wenn Sie einen Bereich von 1-30 und drei Tipps verwenden. (Dies liegt an dem Geburtstagsproblem )

Nun, drei gleiche Ergebnisse zu erhalten, hat immer noch eine Wahrscheinlichkeit von 1 zu 900, wenn man denselben Bereich verwendet.

Vielleicht möchten Sie mehr Hintergrund auf der Analyseseite von random.org

lesen     
alexanderpas 01.07.2010 16:25
quelle
1

Seed in den Pseudo-Zufallszahlengenerator sollte nur einmal außerhalb der Schleife aufgerufen werden. Zeit als Samen zu verwenden, ist eine gute Sache. Es besteht jedoch immer noch die Möglichkeit, dieselbe Zufallszahl zu erhalten.

    
Praveen S 02.07.2010 04:25
quelle
1

Ich empfehle eher, den Systemaufruf gettimeofday () zu verwenden, um den Seed zu erhalten, der verwendet werden soll, um srand () zu füttern.

Etwas wie

%Vor%

Dieser Ansatz kann zu mehr Entropie in Ihrem Pseudonummerngenerierungscode führen. IMHO natürlich

Ciao ciao

    
Paolo Perego 02.07.2010 13:47
quelle

Tags und Links