2009-07-27 15 views
4

Mögliche Duplizieren:
why do i always get the same sequence of random numbers with rand() ?Problem mit rand() in C

Dies ist meine Datei so weit:

#include <stdio.h> 

int main(void) { 
    int y; 
    y = generateRandomNumber(); 
    printf("\nThe number is: %d\n", y); 
    return 0; 
} 

int generateRandomNumber(void) { 
    int x; 
    x = rand(); 
    return x; 
} 

Mein Problem ist, rand() IMMER 41 zurückkehrt. Ich benutze gcc beim win ... nicht sicher, was ich hier machen soll.

EDIT: Zeit zu verwenden, um eine Zufallszahl zu generieren wird nicht funktionieren. Es bietet mir eine Nummer (12000ish) und jedes Mal, wenn ich anrufe, ist es nur ein wenig höher (etwa +3 pro Sekunde). Das ist nicht die Zufälligkeit, die ich brauche. Was mache ich?

+2

genau duplizieren: http://StackOverflow.com/Questions/1108780/Why-Do-I-Always-get-the-Same-Sequence-of-random-Numbers-with-rand – Kip

+1

Überprüfen Sie diese Frage für Ihre Beantworten Sie es nur mit der Zeit ändern. http://stackoverflow.com/questions/1068350/random-number-function-is-misfiring Sie müssen nur einmal am Anfang Ihres Programms säen. – GManNickG

Antwort

8

müssen Sie es einen Samen bereitstellen.

Aus dem Internet -

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(void) 
{ 
    int i, stime; 
    long ltime; 

    /* get the current calendar time */ 
    ltime = time(NULL); 
    stime = (unsigned) ltime/2; 
    srand(stime); 

    for(i=0; i<10; i++) printf("%d ", rand()); 

    return 0; 
} 
+2

Beachten Sie, dass die Zeit (NULL) normalerweise gut genug ist, aber es gibt Fälle, in denen Sie mehr Entropie wünschen, so dass Sie mehr Arbeit machen müssen, um einen ausreichend guten Startwert zu erhalten. Es kam mir immer komisch vor, dass man, um gute Pseudozufallszahlen (die Ausgabe von rand()) zu erzeugen, zuerst eine gute Pseudozufallszahl (den Seed) finden muss. –

+2

@Graeme - Das Wort, das Sie in dieser Situation suchen, ist "Catch-22". –

4

Versuchen srand(time(NULL)); vor Ihrem Anruf generateRandomNumber anrufen.

Wie andere bereits erwähnt haben, müssen Sie srand() einmal aufrufen, wenn die Anwendung gestartet wird, nicht jedes Mal, wenn Sie rand() aufrufen.

+0

Das wird nicht funktionieren, weil es mir eine etwas erhöhte Nummer gibt, wenn ich es nochmal anrufe. – akway

+3

Stellen Sie sicher, dass Sie EINMALEN, nicht bei jedem Aufruf von rand(). –

+1

Sie sollen nur den Zufallsgenerator einmal säen –

8

Standard-Trick ist:

srand(time(0)); // Initialize random number generator. 

HINWEIS: diese Funktion srand ist, nicht rand.

Tun Sie dies einmal in Ihrer main Funktion. Rufen Sie danach nur rand an, um Nummern zu erhalten.

Je nach Implementierung kann es auch helfen, einige Ergebnisse von rand zu erhalten und zu verwerfen, damit die Sequenz vom Seed-Wert abweichen kann.

1

wie zuvor, ein Samen. Oft mal sowas wie, time() oder pid()

2

Manchmal benutzen Compiler den gleichen Random Seed, um das Debuggen zu erleichtern, was großartig ist, aber den Zweck der Randomize vereitelt. Es gibt Codebeispiele, wie Sie Ihren Zufallsgenerator mit einem Dataset starten können, normalerweise Systemzeit, aber das ist die Erklärung, warum Sie dieselbe Zahl immer wieder erhalten haben.

4

Dies liegt daran, rand() ist implizit seeded 1.

Wenn Sie die gleiche Zahlenfolge nicht jedes Mal, wenn Sie Ihr Programm ausführen, sollten Sie den Samen gesetzt (mit srand()), wenn das Programm gestartet wird, mit einem Wert, der von einem Lauf zum anderen wechselt.

Die Uhrzeit ist eine beliebte Wahl dafür, aber bedenken Sie, dass dies vorhersehbar ist und daher eine Sicherheitslücke darstellen könnte, wenn Sie möchten, dass Ihre Zahlensequenz unvorhersehbar ist.

+0

Huh. Ich hätte gedacht, dass der Anfangssamen nicht angegeben worden wäre (wie scheinbar alles andere in C), aber es ist genau dort in der Manpage: "Wenn kein Startwert angegeben wird, wird automatisch die Funktion Rand() gesetzt ein Wert von 1 " –

+0

@Jason, wobei die Sequenz durch ein festes Seed bestimmt wird, hilft beim Testen der Bibliothek. Echte Anwendungen müssen den Generator sowieso einsetzen und benötigen oft einen besseren Generator als 'rand()'. – RBerteig