Langage c : les fonctions rand() et srand( )

[Résolu/Fermé]
Signaler
Messages postés
71
Date d'inscription
samedi 11 juillet 2009
Statut
Membre
Dernière intervention
20 août 2013
-
 pacorabanix -
Salut,
je ss entrais de programmer un jeu en console avec devcpp
le but du code est d'initialiser la grille J->G[i][j] avec des caractères aléatoires '0',..,'6'
en premier lieu ca marche tres bien, mais j'ai remarqué ensuite que la même grille est générée pour toute exécution: toujours le '4' en (1,2) le '1' en (5,4) etc... et ce n'est plus intéressant d'avoir le même jeu chaque fois!
et même après l'insertion de "srand( time(NULL));" dans la boucle c'est encore pire car toute la grille se remplie avec des '5'...

voici le code de la fonctiion:

void initJeu(unJeu* J){
int i,j;
for (i=0;i<8;i++) for(j=0;j<8;j++){
//srand( time(NULL));
J->G[i][j] = (char)(1+(int)((float)rand()/32767*6)+'0');
}
return;
}


j'arrive plus à résoudre le prob :-(
aidez moi svp
A voir également:

4 réponses

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 786
Il faut mettre le srand(time(NULL)) avant la boucle for. Cette instruction n'est à appeler qu'une seule fois.
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

BONJOUR,
je débute en c et je voulais juste savoir, j'ai une fonction :tirage aléatoire

int rand_ab(int a, int b) {
int valeur;
srand (time(null));
valeur=rand( )%(b+1);
while (valeur < a) {
valeur= rand( )%(b+1);
return valeur;
}

veuillez me corriger si j'ai fais des erreurs, je ne comprend pas la fonction se qu'elle fait ? srand ?

merci d'avance

met des commentaires devant ton srand, et lance le programme dix fois de suite... tu verras ça ne te semblera plus du tout aléatoire !
Messages postés
71
Date d'inscription
samedi 11 juillet 2009
Statut
Membre
Dernière intervention
20 août 2013
2
Merci infiniment fiddy
ça marche parfaitement :-)
seed rand, srand, il faut seed rand(), seed = nourrir.

Ca permet, si c'est bien fait (http://www.metasploit.com/users/hdm/tools/debian-openssl/) de guarantir que random ne donnera pas deux fois le meme resultats.

tst@laptop # cat tst.c


int main()
{
srand(1);
printf("%d\n", rand());
}
tst@laptop # ./a.out
1804289383
tst@laptop # ./a.out
1804289383
tst@laptop # (pts/0) [~]

Voila l'interet, time() c'est bien, mais time() * getpid() c'est mieux si on doit executer le programme plusieures fois et plus rapidement (c'est moins previsible au moins, c'est le minimum syndical).
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 786
Ouais, mais getpid() n'est pas portable...