7
votes

Comment "randomiser ()" des nombres aléatoires en C (Linux)?

essayer de générer des nombres aléatoires en C, Rand () ne génère pas de chiffres différents chaque fois que je compile le code, peut-on me dire comment utiliser Srand () ou indiquer à toute autre méthode pour générer.

c

0 commentaires

4 Réponses :


8
votes

Ceci est une solution couramment utilisée:

srand ( time(NULL) );


2 commentaires

Si le programme est exécuté plusieurs fois dans une seconde, la même séquence de numéros aléatoires sera générée plusieurs fois à mesure que la même graine a été utilisée!


Si vous ne voulez rien changer, vous pouvez simplement dormir (1). Mais ça va extrêmement sloooow



12
votes

Afin de générer une séquence de Pseudorandom numéros, le générateur doit être ensemencé . La graine détermine complètement la séquence de nombres qui seront produits. Dans C, vous semez avec Srand code>, comme vous l'indiquez. Selon la page SRAND (3) CODE> Man, aucune semence explicite n'implique que le générateur utilisera 1 comme une graine. Cela dépasse pourquoi vous voyez toujours les mêmes numéros (mais rappelez-vous que la séquence elle-même est assez aléatoire, avec une qualité en fonction du générateur utilisé, même si la séquence est identique à chaque fois).

Utilisateur Mzabsky souligne que l'utilisateur Pour obtenir une graine qui se sent au hasard à un utilisateur humain est de semer avec du temps. Une autre méthode courante (que je viens de voir que Mzabsky souligne également - désolé) est de semer le générateur avec le contenu du générateur de nombres aléatoires du système, qui tire d'un pool d'entropie alimentée par des éléments tels que le mouvement de la souris, les timings de disque, etc. VOUS ne peut pas dessiner beaucoup de hasard dans le générateur de système, car il ne pourra pas recueillir assez d'entropie. Mais si vous venez de dessiner une graine, vous aurez choisi à une séquence aléatoire de nombres aléatoires dans votre programme. Voici un exemple de comment faire cela en C sous Linux: P>

unsigned int seed;
FILE* urandom = fopen("/dev/urandom", "r");
fread(&seed, sizeof(int), 1, urandom);
fclose(urandom);
srand(seed);


0 commentaires

3
votes

Soyez prudent; Le rand (3) Manpage sur Linux note que rand () implémentations sur certaines plates-formes ne donnent pas de bons aléatoire sur les bits inférieurs. Pour cette raison, vous voudrez peut-être utiliser une bibliothèque pour acquérir des nombres aléatoires réels. Glib fournit des fonctions utiles telles que g_random_int_range () qui peut mieux suites de votre but.


0 commentaires

4
votes

Si vous utilisez un système d'exploitation qui ne fournit pas / dev / dev / aléatoire, utilisez quelque chose comme ce qui est indiqué ci-dessous

timeval t1;   
gettimeofday(&t1, NULL);   
unsigned int seed =  t1.tv_usec * t1.tv_sec;

unsigned char mac_addr[6];  
getMAC(&mac_addr);  
improveSeedWithMAC(&seed, mac_addr) ; // MD5 or checksum ...

srand(seed);


0 commentaires