[c] nombre aléatoire - comment générer un nombre vraiment aléa

Bonjour, j’ai un petit problème : dans un programme , pour générer un nombre aléatoire je fais ceci :


int n,max=50,liste[15];
for(i=0;i<15;i++) {
srand(time(0));  
liste[i] = (rand() % max);
}
// On affiche la liste
 

et le seul problème c’est que si je lance le programme deux fois avec un intervalle très réduit (1 a 2 secondes), ca m’affiche deux fois la meme liste : il y a un problème avec la fonction aléatoire.

Comment résoudre ce problème

Je vous remercie d’avance de vos conseils

non non.

aléatoire = fictif sur ordinateur.

Tu as toujours du pseudo aléatoire, au moins pour pouvoir tester une même séquence si ton programme plante.

Si tu veux rendre ton boxon encore plus aléatoire, essaye de passer autre chose que time(0) à srand. Genre srand(rand()).


unsigned long prng(unsigned long state)
{
  return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
}

int n,max=50,liste[15];
for(i=0;i<15;i++) {
srand(time(0));  
liste[i] =prng (rand() % max);
}

Plus d’info sur le code ici (la flemme d’expliquer :ane: )

srand(rand()) ça donnera toujours la même séquence :neutre: vu que rien dépend de rien de "volatile".

Je sais pas :slight_smile: j’utilise pas rand(). J’utilise mt_rand() en php qui donne de bons résultats.

Srand ne sert qu’à initiliser la “graine” servant à tirer la série de nombres pseudo aléatoire. Si tu utilise la même graine, il est normal que tu tire le même nombre. donc tu initialise en dehors de la boucle comme ci-dessus. si vraiment tu a besoin de réintialiser la graine, il faut mettre un paramètre en plus de l’heure, par exemple:
srand(time(0)+i )
ou srand(time(0) + liste[i]
mais ici, ça ne sert à rien à mon avis.
:slight_smile:

Oui et non car il initialise en fonction de l’heure système celà une milliseconde doit pas s’écouler entre deux boucle sinon yen a pas bon (ya quelque chose qui fume dans le proco) :wink:

Ah Ok,
Mais de toute façon, c’est pas un bonne chose de réinitialiser la graine à chaque fois, ça ne sert à rien, et la répartition homogène de la série aléatoire n’est plus garantie.
En fait, bien souvent, c’est une erreur de copier coller pris dans un bouquin, on prend l’exemple unitaire et on pense qu’il faut systématiquement appeler les 2: srand et rand, bref…

sans compter que même si le compteur est en milliseconde, on m’a toujours appris que sur les PC, c’est loin d’être précis à la milliseconde, et si c’est au centième, dans une boucle, il est plus que probable d’avoir plusieurs exécution dans un centième de seondes. :neutre:
edit: euh, et avec un calcul: un procos à 1GHz, on a un temps de cycle de 1nanoseconde, les instructions font au pif 10 temps de cycle, alors il s’en passe des choses en 1 milliseconde. :wink:

Par contre dans certains cas où ya des très gros appels dans la boucle ça peut être utile…

j’ai jamais dis que c’était bien :o je donne juste un exemple pour avoir un truc plus aléatoire. Moi niveau aléatoire j’avais fait pire : tu prend l’hauteur courante de la pile (int i, j = &i + sizeof(int); et tu joue avec…