2009-07-27 10 views
4

Possible en double:
why do i always get the same sequence of random numbers with rand() ?problème avec rand() en C

Ceci est mon dossier jusqu'à présent:

#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; 
} 

Mon problème est rand() renvoie toujours 41. J'utilise gcc sur win ... je ne sais pas quoi faire ici.

EDIT: L'utilisation de l'heure pour générer un nombre aléatoire ne fonctionnera pas. Il me fournit un nombre (12000ish) et chaque fois que j'appelle c'est juste un peu plus haut (environ +3 par seconde). Ce n'est pas le hasard dont j'ai besoin. Que fais-je?

+2

exact dupliquer: http://stackoverflow.com/questions/1108780/why-do-i-always-get-the-same-sequence-of-random-numbers-with-rand – Kip

+1

Découvrez cette question pour votre répondre à ce sujet ne changeant qu'avec le temps. http://stackoverflow.com/questions/1068350/random-number-function-is-misfiring Vous n'avez besoin de graver qu'une seule fois, au début de votre programme. – GManNickG

Répondre

8

vous devez lui fournir une graine.

De l'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

Notez que le temps (NULL) est généralement assez bon, mais il y a des cas où vous voulez plus d'entropie donc vous devez faire plus de travail pour arriver à une graine assez bonne. Cela m'a toujours semblé bizarre que pour générer de bons nombres pseudo-aléatoires (la sortie de rand()), il faut d'abord trouver un bon nombre pseudo-aléatoire (la graine). –

+2

@Graeme - Le mot que vous recherchez dans cette situation est "Catch-22". –

4

Essayez d'appeler srand(time(NULL)); avant votre appel à generateRandomNumber.

Comme d'autres l'ont indiqué, vous devez appeler srand() une fois lorsque l'application démarre, pas chaque fois que vous appelez rand().

+0

Cela ne fonctionnera pas car il me donne un nombre légèrement augmenté si je l'appelle à nouveau. – akway

+3

Assurez-vous de lancer une seule fois, pas à chaque appel de rand(). –

+1

Vous êtes seulement supposé ensemencer le générateur de nombres aléatoires une fois –

8

trick standard est:

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

REMARQUE: cette fonction est srand, pas rand.

Faites-le une fois dans votre fonction main. Après cela, appelez seulement rand pour obtenir des chiffres. En fonction de l'implémentation, il est également possible d'obtenir et de supprimer quelques résultats de rand, pour permettre à la séquence de diverger de la valeur de départ.

1

comme précédemment, une graine. Souvent des fois quelque chose comme, time() ou pid()

2

Parfois, les compilateurs utilisent la même graine aléatoire pour faciliter le débogage, ce qui est excellent, mais cela va à l'encontre du but de la randomisation. Il existe des exemples de code sur la façon de graver votre générateur aléatoire avec certains jeux de données, généralement le temps système, mais c'est la raison pour laquelle vous avez obtenu le même nombre encore et encore.

4

C'est parce que rand() est implicitement seeded à 1.

Si vous ne voulez pas la même séquence de nombres à chaque fois que vous exécutez votre programme, vous devez définir la graine (en utilisant srand()) lorsque le programme démarre, avec une valeur qui change d'une course à l'autre. L'horloge est un choix populaire pour cela, mais gardez à l'esprit que cela est prévisible, et pourrait donc être une vulnérabilité si vous voulez que votre séquence de numéros soit imprévisible.

+0

Huh. J'aurais deviné que la graine initiale aurait été laissée non spécifiée (comme apparemment tout le reste en C), mais bien sûr, c'est juste là dans la page de manuel: "Si aucune valeur de départ n'est fournie, la fonction rand() est automatiquement une valeur de 1. " –

+0

@Jason, ayant la séquence être déterminée par un aide de semences fixes testant la bibliothèque. Les vraies applications doivent de toute façon semer le générateur et ont souvent besoin d'un meilleur générateur que 'rand()'. – RBerteig