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

C++ Discussion :

Aléatoire ? pas si aléatoire !


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 185
    Par défaut Aléatoire ? pas si aléatoire !
    Bonjour,
    J'essai d'écrire un bout de code qui me calcul des positions aléatoires sur une sphère. Voilà mon code (ce code est écrit pour Ogre, mais le problème n'a rien à voir avec Ogre, le problème vient de ma génération des nombres aléatoires) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            int r = 8000;
            float u, v;
     
            for (int i=0; i<1000; i++) {
                u = (int)((float)rand()/32767*360);
                v = (int)((float)rand()/32767*360);
               StarsFieldBillboard[i] = StarsField->createBillboard(r*cos(u)*cos(v), r*sin(u)*cos(v), r*sin(v));
     
            }
    où alors remplacez les lignes correspondantes par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                u = rand()%360;
                v = rand()%360;
    voilà le résultat à l'affichage (même résultat apparent dans les deux cas) :


    je ne comprends pas ce qui ne va pas...

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Pour être franc, je ne saurais pas te dire ce qui cloche dans le code ci-dessus, où plutôt que faire pour qu'il te donne des nombres "plus aléatoires".

    Pourquoi ? Car chaque fois que j'ai besoin de nombres aléatoires, j'utilise Boost.Random.

    Tu trouveras un tuto sur le sujet sur l'espace developpez de Miles :
    http://miles.developpez.com/tutoriels/cpp/boost/random/

  3. #3
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Peut-être qu'il faut initialiser le générateur de nombre aléatoires (avec une fonction seed parfois) ?

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Tu peux déjà essayer un srand( time (NULL)); avant les appels à rand();
    Mais je ne suis pas sûr que ça soit suffisant.

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Mais le générateur de nombres aléatoires de la lib C n'est pas terrible de toute manière.

    Au passage, Boost.Random sera intégrée à la prochaine version de la bibliothèque standard

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par TocTocKiéLà?
    u = (int)((float)rand()/32767*360);
    v = (int)((float)rand()/32767*360);
    Pourquoi la conversion en entier ? C'est cela qui génère la distribution en cercles concentriques.

    (Aussi, utilise RAND_MAX plutôt que 32767.)

  7. #7
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Et pusiqu'on en est à parler de générateur de nombre aléatoire :

    http://random.irb.hr/ est un service de génération de nombres aléatoire.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 185
    Par défaut
    Citation Envoyé par Sylvain Togni
    Pourquoi la conversion en entier ?
    c'est une erreur de ma part...

    en tenant compte de tes indications, j'ai effectivement plus de cercles concentriques, mais j'ai toujours ce phénomène de pôles :


    je vais regarder du côté de Boost.Random comme l'a proposé Alp

  9. #9
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    mais c'est normal "X suit une loi uniforme" n'entraîne pas "cos(X) suit une loi uniforme"
    Génère directement (avec rand) des valeurs pour cos(u) et cos(v) par exemple, et détermine les sinus en conséquence. Dans ce cas là ça sera uniforme.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 185
    Par défaut
    Citation Envoyé par Twindruff
    mais c'est normal "X suit une loi uniforme" n'entraîne pas "cos(X) suit une loi uniforme"
    Génère directement (avec rand) des valeurs pour cos(u) et cos(v) par exemple, et détermine les sinus en conséquence. Dans ce cas là ça sera uniforme.
    sauf que pour un cosinus il y a deux sinus...
    j'ai quand même essayé, avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    manual->position(r*u*v, r*sqrt(1-u*u)*v, r*sqrt(1-v*v) );
    du point de vu mathématique j'ai calculé le sinus à l'aide de la relation cos(x)²+sin(x)² = 1

    voilà le résultat à l'affichage,

    vous pouvez voir - sans mystère - que les valeurs ne sont comprises que dans le cadran des positifs. Mais vous pouvez également voir que la distribution ne semble pas homogène... peut-être n'ai-je pas compris ce que tu as dis, où peut-être pensais-tu à un autre moyen de calculer le sinus à partir du cosinus...

  11. #11
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    Oui c'est à ça que je pensais, je sais bien qu'il y a deux sinux pour une valeur de cosinus mais on peut générer l'autre côté de la même manière (en prenant -racine(1-u²)).
    Bizarre que ce ne soit pas homogène, comment génères tu u et v ?

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

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 17h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 16h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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