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 :

Fonction aléatoire sans la fonction RND


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut Fonction aléatoire sans la fonction RND
    Bonjour,

    Je cherche a obtenir un nombre aleatoire equiprobable, entre -10 et +10 (des entiers au pas de 0.5 : -10;-9.5;-9;...;+9;+9.5;+10) SANS utiliser la fonction random .

    Je suis perdu sur la determination des coef de cette formule : Un+1 = ( a * Un + b ) % c


    Avez-vous des idées ?

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.

    Il existe de très nombreux algorithmes pour ça. Le standard est le Mersenne Twister. Tu peux aussi utiliser "Xorshift1024*" (attention à l'étoile et au 1024).

    Note que ces générateurs ne doivent pas être utilisés pour de la cryptographie. Dans ces cas-là il faut d'autres algorithmes, plus lents.


    Si toutefois tu insistes pour utiliser ta formule (qui donnera un générateur pseudo-aléatoire médiocre), alors...
    * C doit valoir 10 pour produire des résultats variables entre -10 et +10. -10 devrait également fonctionner, à vérifier.
    * A doit être négatif. Sinon tous les nombres générés (après un certain temps) seraient positifs ou négatifs selon le signe de B.
    * A doit être non-nul. Sinon on générerait toujours le même nombre.
    * Hormis cela, A et B peuvent être quelconques. Mais il doit y avoir d'autres critères de qualité pour accroître la période.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Qu'as-tu contre la fonction random ?

    Il faut tirer 1 valeur parmi 41. Donc déjà, il est probable que le modulo "c" soit 41, avec la bijection suivante:
    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
    40
    41
    0 -> -10
    1 -> -9.5
    2 -> -9
    3 -> -8.5
    4 -> -8
    5 -> -7.5
    6 -> -7
    7 -> -6.5
    8 -> -6
    9 -> -5.5
    10 -> -5
    11 -> -4.5
    12 -> -4
    13 -> -3.5
    14 -> -3
    15 -> -2.5
    16 -> -2
    17 -> -1.5
    18 -> -1
    19 -> -0.5
    20 -> 0
    21 -> 0.5
    22 -> 1
    23 -> 1.5
    24 -> 2
    25 -> 2.5
    26 -> 3
    27 -> 3.5
    28 -> 4
    29 -> 4.5
    30 -> 5
    31 -> 5.5
    32 -> 6
    33 -> 6.5
    34 -> 7
    35 -> 7.5
    36 -> 8
    37 -> 8.5
    38 -> 9
    39 -> 9.5
    40 -> 10
    Il ne reste plus qu'à trouver a et b générateur.

    Vue la base 41, il y a des chances que b=0.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    que proposes-tu pour a ?

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Au temps pour moi, ça ne marche pas. J'explique mon erreur.

    Le modulo 41 apporte forcément 41 valeurs réparties entre 0 et 40.
    Or, avec un groupe cyclique basé sur un nombre premier (41), il a forcément un générateur.
    Et effectivement, il y a 6, 7, 11, 12, 13, 15, 17, 19, 22, 24, 26, 28, 29, 30, 34, 35 comme générateurs.

    Mais là où ça ne marche pas c'est que le 0 est exclu de la génération.
    Donc elle fournit 40 valeurs et non 41.

    On pourrait dire "Prenons 42 comme base".
    Mais 42 n'est pas premier.
    Et ce n'est pas facile de trouver un générateur.

    Le but de ta formule est
    • de couvrir toutes les valeurs de 0 à 40.
    • de ne pas voir la logique.


    C'est le deuxième point qui fait travailler.
    Car on pourrait prendre Un+1 = ( 1 * Un + 1 ) % 41 et ça marcherait.
    Mais là, la logique est trop apparente.

    Tu peux par exemple prendre 17 pour b et 1 pour a:
    Un+1 = ( 1 * Un + 17 ) % 41
    1 18 35 11 28 4 21 38 14 31 7 24 0 17 34 10 27 3 20 37 13 30 6 23 40 16 33 9 26 2 19 36 12 29 5 22 39 15 32 8 25

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    Merci à tous pour vos participations.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 20/11/2014, 08h13
  2. [PHP 5.3] Fonction aléatoire sur tableaux
    Par Claire-Diane dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2011, 13h33
  3. erreur : Object required sur la fonction resizeTo sur IE7
    Par nakata77 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 01/04/2010, 16h05
  4. Erreur aléatoire sur une fonction
    Par defluc dans le forum Firebird
    Réponses: 8
    Dernier message: 10/09/2007, 16h34
  5. [Fonction]Explication sur la fonction EXPLODE de php
    Par daudet dans le forum Langage
    Réponses: 6
    Dernier message: 13/04/2006, 17h06

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