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

Algorithmes et structures de données Discussion :

Créer un vecteur aléatoire


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut Créer un vecteur aléatoire
    La génération de nombre aléatoire est un sujet assez vaste, les utilisations nombreuses. Je souhaiterais créer un vecteur (3D) aléatoire :

    Il est possible de choisir chaque coordonnées de manière aléatoire, par exemple choisir chaque coordonnées entre -1 et 1, de générer un vecteur avec ces coordonnées.

    Ceci apportent quelques problèmes :
    -> Il est possible de tomber sur le vecteur nul (ce qui n'est pas un problème en soit), mais par la suite si on désir un vecteur de norme, 1 aléatoire, alors notre modé de génération nous retourne un vecteur que l'on ne pourra pas normaliser.
    -> Le vecteur ainsi généré n'est pas choisi de manière uniforme dans le volume possible, je m'explique. Ce n'est pas parcequ'on choisi aléatoirement uniformément les coodronnées qu'elles ne vont pas donner une répartition des vecteurs générés aléatoire et uniforme...
    La preuve dans le cas décrit au dessus, on constate une répartition non uniforme dans l'espace; on peut distinguer une forte concentration au centre et sur 4 axes qui sont les bisectrices des sommets des tétraèdres formés par les axes sur lesquels ont à choisi les coordonnées aléàtoirement.... (Je ne sais pas si j'ai pas perdu du monde en route la )
    Pour faire clair, dans le plan (en 2D) on aurai une forte concentration des vecteurs généré sur deux axes : la première bisectrice, et sa perpendiculaire passant par l'origine du repère...

    Ma question :
    Comment serai-t-il possible de générer de manière simple et rapide des vecteurs aléàtoires sans ces effets néfastes

    j'insiste sur simple et rapide car je présens une certaine dérive possible.
    Il faut se dire que cette génération va être appelée dans un jeu, jusqu'à 10000 par frame, donc pas de truc dans le genre trucs de fou.... merci d'avance

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    En 2D les coordonnées polaires résolvent le problème. En 3D aussi, je pense.

  3. #3
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Ben en fait non car ça fait toujours une concentration autour de l'origine...
    Alors j'avais pensé faire un choix non linéaire du rayon, c'est à dire non pas choisir un nombre pour le rayon de manière equiprobable, mais plutôt logarithmique de manière à éloingner les possibilités de choix au centre mais c'est lourd à mettre en place car il faut que je fasse une fonction rand non linéaire, donc pour faire un truc jolie une fonction rand à laquelle on peut passer une fonction de répartition....

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Si le générateur aléatoire a une dimensionalité supérieure à 3, c'est bon non ?
    En fait, je pense aux générateurs qui peuvent générer n dimensions statistiquement indépendantes comme les MT19937 par exemple.

  5. #5
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Citation Envoyé par Miles
    Si le générateur aléatoire a une dimensionalité supérieure à 3, c'est bon non ?
    En fait, je pense aux générateurs qui peuvent générer n dimensions statistiquement indépendantes comme les MT19937 par exemple.
    Je ne connais pas les MT19937, mais ce que je sais c'est que choisir aléatoirement uniformément suivant 3 axes ne va pas donner un choix aléaoitre uniforme en combinant les directions...

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Avec un MT19937 oui, tu peux même aller au-delà de 600 dimensions à ton parallélépipère dans lequel tu tires tes points, et la répartitition sera toujours encore uniforme dans le volume.
    Maintenant, si pour toi, le but est de générer aléatoirement dans une sphère, c'est un autre problème

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Citation Envoyé par Rafy
    Ben en fait non car ça fait toujours une concentration autour de l'origine...
    Alors j'avais pensé faire un choix non linéaire du rayon
    Tu peux faire quelque chose de très très simple
    R = rayon maximum,
    Rand une fonction qui te ramène un nombre entre 0 et 1
    r = rayon trouvé :

    r = R * Racine n-ième(Rand)

    A toi de déterminer la bonne valeur de n...

  8. #8
    Membre chevronné
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Par défaut
    Je me souviens de cette discussion:

    http://www.developpez.net/forums/showthread.php?t=78786

  9. #9
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    il est possible de faire des tirages aléatoires avec la fonction du langage que tu utilises, puis de passer ces nombres dans des algos utilisant des fonction XOR. Ceci est fait en cryptographie.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  10. #10
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Citation Envoyé par FrancisSourd
    Je viens de lire le post. Ca veut dire qu'au lieu de choisir mes coordonnées entre -1 et 1, si je les choisi entre -inf et +inf, alors je vais minimiser la concentration sur les diagonales du cube englobant ????

  11. #11
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Citation Envoyé par Médiat
    Tu peux faire quelque chose de très très simple
    R = rayon maximum,
    Rand une fonction qui te ramène un nombre entre 0 et 1
    r = rayon trouvé :

    r = R * Racine n-ième(Rand)

    A toi de déterminer la bonne valeur de n...
    Ouais j'avais pensé utiliser le sinus ou le cosinus pour me créer une non uniformité dans le choix pour le rayon....
    Racine sera plus rapide mais provoquera surement des trucs étrange en 0 du fait de la tangeante nul : il va y avoir un effet de fuite du centre, et je pense que ça va faire l'effet inverse : je n'aurais plus rien au milieu.... A voir il faut tester...
    Mais je ne sais pas comment faire pour générer un veteur aléatoire dans l'espace... Car le coup des coordonnées polaire dans le plan peuvent peut-être palier au problème d'effet de "croix", mais dans l'espace, il faut que je choisisse 2 angles, et un rayon, et je pense que je vais encore avoir un problème avec ces 2 angles... Il vas y avoir un autre effet de bord.
    Et puis il va y avoir des projections à faire pour revenir en coordonnées cartésiennes, c'est à dire plein de sinus et de cosinus, et ça c'est pas très cool, car c'est pas rapide... (je rapelle : jusqu'a 10000 fois par frame) Ca risque de piquer.

  12. #12
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Citation Envoyé par Graffito
    Bonjour,

    En 2D les coordonnées polaires résolvent le problème. En 3D aussi, je pense.
    je ferais comme Graffito, j'ai testé, voila ce que ca donne en 2D


    Vecteurs


    Ca m'a bien l'air uniforme, et je vois pas pourquoi ca changerai en 3D... ?

    Et question rapidité, l'algo est très simple, en 2D là

    Point1 = Random
    Angle = Random
    Point2.X = Norme * cos( Angle )
    Point2.Y = Norme * sin( Angle )
    ou alors, j'ai rien compris à la question, c'est possible aussi
    Etant donné que Cos et Sin peuvent être des tableaux et non des fonctions comme je l'ai cité, si on veut de la rapidité pure., donc très peu d'opérations élémentaires
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  13. #13
    Membre chevronné
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Par défaut
    Un moyen assez radical pour tirer les points rapidement est de précalculer un grand nombre de points sur la sphère (uniformément répartis), de les stocker et de tirer à chaque fois un point dans cette collection.

  14. #14
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Citation Envoyé par FrancisSourd
    Un moyen assez radical pour tirer les points rapidement est de précalculer un grand nombre de points sur la sphère (uniformément répartis), de les stocker et de tirer à chaque fois un point dans cette collection.
    C'est le principe de "la balle de golf".

    Cette méthode est extrêmement performante sur un problème 'statique' (nombre de points sur la sphère qui ne variera pas).

    Elle nécessite, en revanche, un bon calcul de la répartition initiale de tous ces points : un bon maillage isotrope.

    L'avantage essentiel, en terme de performances, c'est que ce maillage peut même faire partie des données initiales du programme, il n'a pas besoin d'être calculé en direct.

  15. #15
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    Un moyen assez radical pour tirer les points rapidement est de précalculer un grand nombre de points sur la sphère (uniformément répartis), de les stocker et de tirer à chaque fois un point dans cette collection
    C'est 1 peu ce que je préconisais en proposant un calcul par moindre carrés pour localiser ces N points.
    Je pense qu’il est tout de même préférable de limiter un peu ce nombre de points et d’assimiler la sphère à son plan tangent autour de ces N points puis de faire une pondération à partir des sommets de chacun des éléments de surface. Il s’agit là de trouver le meilleur compromis dans un cadre donné.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 25/05/2007, 16h28
  2. Réponses: 2
    Dernier message: 06/04/2007, 11h30
  3. Réponses: 24
    Dernier message: 15/02/2007, 23h41
  4. créer un fchier aléatoire avec un nom unique
    Par hansaplast dans le forum Langage
    Réponses: 2
    Dernier message: 20/10/2006, 15h37
  5. Créer un password aléatoire
    Par finalfx dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/10/2006, 09h37

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