IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

[SDL] génération de nombres aléatoires


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [SDL] génération de nombres aléatoires
    Salut tout le monde ,
    je développe une petite application sur SDL et voici le probleme montré sur image :



    je dois générer des coordonnées aléatoire pour chaque flèche blité , le problème vient quand la fonction rand donne parfois les mêmes nombres ,alors que je cherche a obtenir 5 positions différents pour chaque flèche dans chaque sens .
    Comment éviter cela
    PS : si besoin de la partie du code concernée je l'affiche .
    Merci pour votre aide =) .

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Salut,

    Il n'y a rien d'anormal a cela, les tirages etant independant, tu as toujours une probabilité de tirer les meme coordonnées (d'ailleurs sur ton exemple ce n'est pas exactement identique). Cette probabilité est inversement proportionnelle a la taille de ton terrain.

    En fait tu peux faire plusieurs choses pour eviter cela :

    • Soit pour chaque tirage, tu verifies qu il n'est pas trop pres d'un autre tirage anterieur. Dans ce cas il faut que le nombre de tirage reste petit devant le nombre de possibilités sous peine de devoir retirer de nombreuses fois.
    • Soit tu separes ton terrain en un nombre de zone de taille identique equivalent au nombre de tirage, et tu realises un tirage par zone. Comme ca tu es sur que ca sera bien distribué sur tout le terrain. (met tu perds un peu le coté completement aleatoire)


    Mais en fait sur ton exemple, les meme coordonnées ont l'air de revenir souvent (créant des effets de lignes et de colonnes). Peux etre peut tu nous montrer la facon dont tu generes tes nombre pseudo aléatoires. Il y a peu etre un probleme aussi de ce coté la (a moins que c esoit le but recherché...)

    [EDIT]
    EN regardant de plus pres, les fleches horizontales ont toutes la meme abscisse et les fleches verticales toutes la meme ordonnée. C'est ce que tu veux ou non ?
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Salut,

    On pourrait avoir le code ou la ligne permettant de faire ce "tirage aleatoire" ?

    Car vu comme ca, c'est etrange que toutes les fleche dirigé verticalement est la meme abscisse et que toutes les fleches dirigé horzizontalement est la meme ordonné.

    Pour donner des piste :
    - Il faut faire appel a srand UNE fois ( au debut du main par exemple ) pour initialiser la chaine pseudo-aleatoire.
    - Il ne faut pas utiliser le modulo, cela n'effectue pas un tirage reellement equiprobable.

    Cette page pour mieux te renseigner :
    http://c.developpez.com/faq/index.ph...DOM_rand_srand
    (vive la )

    Aussi, si le probleme persiste, pourrai-t'on avoir un minimum de code (et plus particulierement celui ou tu affecte tes coordonnées aleatoire ?)

    Autre idée, verifie que tu met bien de l'aleatoire pour les deux coordonnées.

    Bon courage pour la suite et si tout va bien

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Frifron Voir le message
    Salut,
    • Soit tu separes ton terrain en un nombre de zone de taille identique equivalent au nombre de tirage, et tu realises un tirage par zone. Comme ca tu es sur que ca sera bien distribué sur tout le terrain. (met tu perds un peu le coté completement aleatoire)
    Merci pour cette solutions , j'avais pas pensé .
    400 /5 flèches ça donne des possibilités .

    Citation Envoyé par Frifron Voir le message
    [EDIT]
    EN regardant de plus pres, les fleches horizontales ont toutes la meme abscisse et les fleches verticales toutes la meme ordonnée. C'est ce que tu veux ou non ?
    Oui pour ça , c'est ce que je veux :Toutes les flèches dirigé verticalement ont la même abscisse et que toutes les flèches dirigé horizontalement on les mêmes ordonnées.

    Voici la partie du code ou cas ou ?! :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    typedef struct
    {
    	SDL_Rect left  [5],
    		     right [5],
    		     down[5],
    		     up    [5];
           unsigned int speed;
    }Arrow;
     
     
    /* fonction : initialiser les positions de départ pour chaque coté (left , right...etc )*/
     static void init_ArrowFeel(Arrow *arrow)
     {
    	FILE *_f = fopen ("FlechesPositions.txt","w");
     
         srand((unsigned int) time(NULL)); /* iostream */
    	for (size_t i=0; i < 5;i++)
    	{    /* cnst */
    		arrow->left [i].x = 2;
    		arrow->right[i].x = 450;
    		arrow->up   [i].y = 2;
    		arrow->down [i].y = 350;
     
    		/*recuperation des rand  emplacements*/
    	     arrow->up[i].x    =(rand() % (470)) + 15 ;
    	     arrow->down[i].x  =(rand() % (470)) + 15 ;/*entre 15 et 485 */
    	     arrow->left [i].y =(rand() % (370)) + 15 ;
    	     arrow->right[i].y =(rand() % (370)) + 15 ;
     
     
    	     /*fichier pour voir si les positions (générer automatiquement) de chaque coté sont identiques ou pas !*/
    	     fprintf (_f,"up.x = %d\t donw.x = %d\tleft.y =%d\t right.y =%d\n",
    	     arrow->up   [i].x,
    	     arrow->down [i].x,
    	     arrow->left [i].y,
    	     arrow->right[i].y );
    	}
    	fclose(_f);
     }
    @SofEvans > La fonction srand n'est appelé qu'une seul fois .
    EDIT:
    Que veux tu dir par : n'utilises pas le modulo ?

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par canBelive Voir le message
    @SofEvans > La fonction srand n'est appelé qu'une seul fois .
    EDIT:
    Que veux tu dir par : n'utilises pas le modulo ?
    Je veux dire, n'utilise pas les modulo si tu veux avoir autant de chance que ta fleche soit en x 23 qu'en x = 34 (et ainsi de suite)

    C'est parfaitement bien expliquer dans la FAQ et la formule pour avoir un bon nombre aleatoire est aussi donnée.

    Sinon, je crois comprendre que tu ne veut pas qu'une fleche soit deja presente sur une autre, c'est ca ?

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Sinon, je crois comprendre que tu ne veut pas qu'une fleche soit deja presente sur une autre, c'est ca ?
    Oui ..Finalement je crois que je vais utiliser la méthode de Frifron.
    merci a vous pour vos repenses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 19/01/2012, 12h56
  2. Génération de nombres aléatoires
    Par nono_31 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 05/07/2008, 21h06
  3. défaut des fonctions de génération de nombres aléatoire type rand()
    Par Christophe30 dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 17/02/2008, 20h21
  4. Génération de nombre aléatoires
    Par rebaudo dans le forum Smalltalk
    Réponses: 1
    Dernier message: 29/11/2007, 12h54
  5. recherche algo de génération de nombre aléatoire
    Par Pascale38 dans le forum MFC
    Réponses: 2
    Dernier message: 26/01/2004, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo