Nombre aleatoire

Résolu
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 - 14 juin 2008 à 19:36
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 14 juin 2008 à 22:34
Bonjour à tous,
    Je développe actuellement une bataille navale en console. Pour placer les bateaux du PC et les tirs du pc, il faut que je crer un nombre aleatoire pour les coordonnés, ce que je fait avec :
    srand(time(NULL));
    X = ((rand() % (10 - 1 + 1)) + 1);
Or les nombres sortis sont très souvent les même et se situent toujours dans la diagonale de la grille. Quelqu'un sait-il pourquoi, y a-t-il une autre solution pour créer un nombre aléatoire plus "fiable"?
voici le main (Ce n'est que le début mais ca ne sert à rien que je continu tant que ce problème n'est pas réglé...) :

int main()
{
    SetConsoleTitle("Bataille navale");
    system("mode con: cols=25 lines=25");
    int X, Y;
    Espace();//Dessine la grille
    srand(time(NULL));
    X = ((rand() % (10 - 1 + 1)) + 1);
    srand(time(NULL));
    Y = ((rand() % (10 - 1 + 1)) + 1);
    gotoxy(X-1+X, Y+Y);//Pour placer un "point" dont les coordonnés sont les nbrs aléatoire
    Color(0,12);
    printf(" ");
    getch();
    return 0;
}
le resultat (la grille est normale, mais les points toujours dans les cases qui contiennent un "*", la diagonale) :
 0 1 2 3 4 5 6 7 8 9
+-------------------+
¦* ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦A
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦* ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦B
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦ ¦* ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦C
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦ ¦ ¦* ¦ ¦ ¦ ¦ ¦ ¦ ¦D
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦ ¦ ¦ ¦* ¦ ¦ ¦ ¦ ¦ ¦E
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦ ¦ ¦ ¦ ¦* ¦ ¦ ¦ ¦ ¦F
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦* ¦ ¦ ¦ ¦G
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦* ¦ ¦ ¦H
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦* ¦ ¦I
+-+-+-+-+-+-+-+-+-+-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦* ¦J
+-------------------+
(Dans la console, les colonnes sont biens alignées)

//Merci à tous de vous interesser à mon problème,Cordialement,
B@stien
PS: Il me semble que code-source ne supporte pas les unicodes et affiche des "?" à la place (Pour la grille))

4 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
14 juin 2008 à 20:03
faut pas faire srand(time(null)) à chaque fois, ça sert à initialiser le générateur de nombres aléatoires une fois pour toutes.
(en début de code donc).
Cela dit, je suis pas sûr que ton problème vienne de là.
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
14 juin 2008 à 20:06
réflexion faite si ce doit être la cause de ton problème; comme tu fais srand(time(null)) avant de tiere x puis avant de tirer y, donc à intervalle très rapproché, ça doit initialiser rand au même point => X=Y à peu près à chaque fois. 
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
14 juin 2008 à 20:14
Merci beaucoup juju, ca fonctionne avec juste un srand(time(NULL)) au début.
Merci beaucoup

//Cordialement,
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
14 juin 2008 à 22:34
Bonsoir,

time(NULL) rend l'heure sous forme du nombre de secondes écoulées depuis le 1er janvier 1970 ! Donc plusieurs srand(time(NULL)) fait les uns derrière les autres comme ici (avec de grandes chances de tomber dans la même seconde de temps écoulé) donnent la même "graine" de départ pour le générateur de nombres pseudo-aléatoires et donc les mêmes tirages de nombres pseudo-aléatoires.

Jean-François
0
Rejoignez-nous