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

Résolu/Fermé
marven23 Messages postés 71 Date d'inscription samedi 11 juillet 2009 Statut Membre Dernière intervention 20 août 2013 - 13 juil. 2009 à 23:42
 pacorabanix - 28 oct. 2009 à 03:15
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

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
13 juil. 2009 à 23:44
Il faut mettre le srand(time(NULL)) avant la boucle for. Cette instruction n'est à appeler qu'une seule fois.
3
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
1
pacorabanix
28 oct. 2009 à 03:15
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 !
0
marven23 Messages postés 71 Date d'inscription samedi 11 juillet 2009 Statut Membre Dernière intervention 20 août 2013 2
14 juil. 2009 à 00:00
Merci infiniment fiddy
ça marche parfaitement :-)
0
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).
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
14 juil. 2009 à 01:16
Ouais, mais getpid() n'est pas portable...
0