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 :

Quel algorithme pour rand ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 34
    Points
    34
    Par défaut Quel algorithme pour rand ?
    Bonjour,

    Je m'intéresse au fonctionnement interne de rand, et j'aimerais savoir quel algorithme est utilisé dans le standard C (et si la norme ne dit rien, qu'en est-il en pratique avec gcc par exemple ?).

    J'ai déjà fait quelques recherches, et suis tombé sur les congruences linéaires et Mersenne Twister, mais pas moyen de savoir ce qui est utilisé dans rand.

    Quelqu'un peut éclairer ma lanterne ?

    Merci,
    Sébastien

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Parce que ce qui est utilisé dans rand est spécifique à chaque implémentation. La norme propose (pas impose) cependant un algorithme portable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* #define RAND_MAX 32767 */
     
    static unsigned long int next = 1;
     
    void srand(unsigned int seed)
    {
        next = seed;
    }
     
    int rand(void)
    {
        next = next * 1103515245 + 12345;
        return (unsigned int)(next/65536) % 32768;
    }

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Et de façon générale, il ne faut JAMAIS présupposer de l'algorithme de rand, notamment pour une pseudo-cryptographie. Si tu as besoin d'un générateur aléatoire particulier, tu DOIS l'implémenter toi-même et ne pas compter sur rand pour ça, même si l'implémentation que tu utilises est "la bonne". En effet, cela peut changer à tout moment sans préavis suivant les patchs du compilateur, et/ou ne pas être la même fonction d'une plate-forme à l'autre.

    Tu peux également aller lire cette discussion, ainsi que celle-ci, à titre d'information.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Melem Voir le message
    Parce que ce qui est utilisé dans rand est spécifique à chaque implémentation. La norme propose (pas impose) cependant un algorithme portable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* #define RAND_MAX 32767 */
     
    static unsigned long int next = 1;
     
    void srand(unsigned int seed)
    {
        next = seed;
    }
     
    int rand(void)
    {
        next = next * 1103515245 + 12345;
        return (unsigned int)(next/65536) % 32768;
    }

    Si c'est vraiment comme ça dans la pratique c'est très moche...

  5. #5
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Très moche tu veux dire ...

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Tu trouveras un certain nombre d'information sur des algorithmes de génération de nombres pseudo-aléatoire au chapitre 7 de Numerical Recipes. Cette question aurait plus sa place dans le forum algo que C.

    Meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Quel algorithme pour classer des opérations par ordre de priorité
    Par verbose dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 16/06/2014, 11h11
  2. quel algorithme pour trouver le plus grand sous arbres commun à des arbres?
    Par iwky911 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 20/05/2009, 21h08
  3. Réponses: 7
    Dernier message: 12/10/2006, 01h23
  4. Quel algorithme pour insertion d'objets "triés" da
    Par phplive dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2005, 09h27
  5. Quel algorithme utilisé pour faire un arbre hiérarchique
    Par deaven dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 26/01/2005, 21h30

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