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 :

Données "aléatoires" en fonction d'un couple X,Y


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut Données "aléatoires" en fonction d'un couple X,Y
    Bonjour à vous,

    J'aurai besoin d'une function qui me renvoie 1 ou 0, en fonction d'un couple de coordonnées (x, y), mais avec un effet le plus "aléatoire" possible sur l'ensemble des couples (X,Y).

    C'est à dire que pour un meme couple (X1, Y1), ma fonction doit toujours renvoyer la même valeur, mais qu'il doit y avoir une forte entropie sur tous les Xi, Yi.

    J'ai implémenté ceci, en m'inspirant des fonctions de génération pseudo aléatoire de base.

    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
     
    Generer(precedent)
    {
            renvoie (precedent * 1103515245 + 12345)
    }
     
    ObtenirValeur(precedent, min, max)
    {
            valeur <- (previous >> 16)
     
            renvoie min + valeur % (max - min);
    }
     
    Fonction(x, y)
    {
           donneeIntermediaire <- Generer(x * 10000 + y)
           valeur = ObtenirValeur(l_donneeIntermediaire, 0, 1000)
           si valeur >= 500 renvoie vrai
           sinon  renvoie faux
    }
     
    Test()
    {
                pour tout x de 0 à 1024
                {
                    pour tout y de 0 à 768
                    {
                          Affiche(Fonction(x,y))
                    }
                }
    }
    Mais à l'affichage, on se rend vite compte qu'il y a un motif de répétitions qui a une fenêtre d'environ 20 par 20. Je ne sais pas trop comment je pourrais aggrandire cette fenêtre, quelqu'un a t il une idée ?

  2. #2
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    Humm... Soyon naif.
    Si y+x est pair, tu renvoies 1, sinon 0 ?

    Bon, c'est facile a déterminer.

    Plus rigolo, toujours basé sur y+x, si la première décimale de la racine carrée est paire 1, sinon 0.

    C'est mieux, mais on peut tomber sur les mêmes résultat (genre x=1 y=3 donne le meme résultat que x=2 y=2).

    Compliquons encore un peu juste pour le fun (efficacitée non garantie !), tu tests la parité de la racine carrée (ou autre fonction du genre hein...) sur x+y+(le nombre de nombres premiers compris entre 0 et y).

    Bon, ces idées là ne sont pas nécessairement les meilleures, mais pour résumer l'idée qui est derrière, c'est que dans la mesure ou tu veux juste "agrandir ta fenetre", a chaque "agrandissement", le plus simple est encore de rajouter/complexifier une donnée.

    --
    Rakken

  3. #3
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    ce qui me gêne sur le fait de travailler avec comme base x+y, c'est que on aura toujours Fonction(x, y) = Fonction(y, x), et ca ca ne m'arrange pas du tout. Je voudrais aussi éviter les symétries.

    Pour l'instant là ou j'ai les meilleurs résultat c'est avec un truc du genre :

    (((((ulong)i * 1103515245 + (ulong)j) >> (int)(((ulong)i * 1103515245 + (ulong)j))%int.MaxValue)) % 1000) >= 500.

    en X c'est bon, mais en Y, j'ai quand même une répétition.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Hum... ca ressemble etrangement aux fonctions de bruit que l'on utilise en image de synthese pour simuler les textures...

    Peut-etre ce lien pourra-t-il t'aider...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Tu ne peux pas tout générer et stocker dans un tableau de grande taille. Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    fenètre borné par 500,500 par exemple :
     
    fonction f(entier x, entier y) -> {0,1}
     Variable statique non initialisé : tableau
     Si tableau non initialisé
       Pour i = 1 à 500
         Pour j = 1 à 500
          tableau[i][j] <- aleatoire()
     
     Retourner tableau[x][y]

  6. #6
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    Citation Envoyé par millie
    Tu ne peux pas tout générer et stocker dans un tableau de grande taille. Du genre :
    Négatif, mes X et Y peuvent arriver n'importe quand et sont compris entre
    -2 milliards et +2milliards

  7. #7
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    Bon, alors résultat des courses:

    le Sqrt avec la deuxième décimale (sur des X et Y pondérés) a l'air de super bien fonctionner (si on prend la troisième ca fait des "'bandes") entre 0 et 1024 et 0 et 768.

    Mais plus les valeurs grandissent, plus ca donne de la répétitions (genre vers 600000000)

    La méthode du bruit de perlin donné ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      function Noise1(integer x, integer y)
        n = x + y * 57
        n = (n<<13) ^ n;
        return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
      end function
    donne a peu prêt les même résultat partout, mais une trop grande répétitivité en Y.

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Harry_polin
    La méthode du bruit de perlin donné ci dessous (...) donne a peu prêt les même résultat partout, mais une trop grande répétitivité en Y.
    Visiblement tu as pris la fonction noise2D (avec 2 coords). Essaye de prendre 2 fonctions Noise1D, en ajoutant un offset sur une des 2, pour eviter la symetrie x,y.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

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

Discussions similaires

  1. [SQL SVR 2K]Données contenant double quote
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 11/01/2007, 10h46

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