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++

  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 288
    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 288
    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 ?

  12. #12
    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
    comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            u = (float)rand()/RAND_MAX;
            v = (float)rand()/RAND_MAX;

  13. #13
    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
    Ah oui mais je suis bête, u*v ne suit pas une loi uniforme donc il faut chercher comment faire un tirage aléatoire sur une sphère
    On n'est pas parti sur la bonne méthode

    d'ailleurs intuitivement, on voit bien que si u et v sont uniformes entre 0 et 1, quand on les multiplie ensemble, ça les rassemble vers 0

  14. #14
    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
    J'ai trouvé un très bon document !
    PS: une hypersphère est la généralisation à toutes les dimensions de la sphère en 3D, par exemple le disque est une hypersphère pour un espace 2D. Et sur le lien que je t'ai passé, le gars résout le problème pour n'importe quelle dimension donc t'as ce que tu cherches, prends le cas où n=3.

  15. #15
    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
    effectivement ça décrit parfaitement mon problème, je regarderai ça ce soir et je fournirai mes résultats
    Merci

  16. #16
    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
    Ce qu'il précise pas trop c'est que
    - U(0,1) c'est une loi uniforme entre 0 et 1, donc le rand()/rand_max est ok pour ça
    - N(0,1) c'est une loi normale de paramètres 0 et 1, un peu plus compliquée à simuler.

  17. #17
    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
    bon je suis pas un matheu... je vais écrire ce que je comprends :

    La norme du vecteur est calculée aléatoirement avec une loi uniforme. En ce qui me concerne, je veux des points sur la surface d'une sphère, donc ma norme est constante.
    Dans la formule présente dans l'article :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $x_{i}=\frac{r^{\frac{1}{N}}_i\cdot a_{i}}{\sqrt{{\displaystyle \sum _{j=1}^{N}a_{i}}}}$)
    il y a un a_i, je présume qu'il s'agit d'un coefficient aléatoire, calculé selon une loi normale.
    Le x_i correspond selon moi à une composante d'un vecteur

    coté code, dois-je calculé un a_i pour chaque x_i, c-à-d calculé un coefficient aléatoire pour chaque composante du vecteur ? j'ai peur qu'en faisant cela, j'obtient des composantes qui ne correspondera pas aux coordonnées d'un même point.

  18. #18
    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
    En fait je viens de remarquer qu'il y avait une implémentation fournie avec l'article, ça peut être pratique

    pour toi, en 3D, les les x_i sont les coordonnées x,y,z
    En regardant un peu plus en détail, un truc m'avait échappé, en dimension 3 les points peuvent être à l'intérieur de la sphère, tu peux prendre une valeur constante pour r toi alors.

    Bon ça m'énerve je vais tester ça , il est pas trivial du tout ce problème

  19. #19
    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
    Bon j'ai fait des test et je me suis bien amusé
    et ce document donne des méthodes pour générer des points aléatoires sur une sphère http://www.math.niu.edu/~rusin/known-math/96/sph.rand

    La méthode (1) correspond à la méthode du lien du post 14 mais sans la variation du rayon.


  20. #20
    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
    Affaire résolue :


    un grand merci à Twindruff , parce que sans ton intervention j'aurais mis beaucoup plus de temps

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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