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 :

Liste de graines pour générateur Random


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Liste de graines pour générateur Random
    Bonjour, je ne suis pas sur que ce soit la bonne section du forum mais je n'ai pas trouvé mieux. La question est commune au c ou c++ et je pense à tout les générateurs pseudo aléatoire.
    Pour ma part je code sous linux en c++ et utilise le PRNG standard de stdlib.

    Voila mon problème : afin de tester mon programme je lance une série de ~500 exécutions indépendantes de mon programme. Dans mon programme j'utilise la fonction rand(), préalablement initialisé via srand() et l'heure du système, je n'ai donc pas de problème ici.
    Mon problème est que, si je fait une modification du programme et que je relance une nouvelle série de 500 exécutions j'aimerais utiliser LES MÊMES graines que la première série, et dans le même ordre.

    Je cherche donc une liste de ~500 graines pour en donner une à chaque exécution du programme, ma question est comment constituer cette liste ?
    Générer ma liste d'une quelconque manière (un premier tirage random, noter l'heure lors de l’exécution de la toute première série, ect ...) afin de la stocker quelque part et l'utiliser ensuite était ma première idéé, mais cette méthode serait complexe à mettre en oeuvre dans mon cas.

    Il me faudrait donc une manière de déterminer la graine en me basant seulement sur le nombre de lancement du programme. (Par exemple quand je vais lancer pour la 5° fois mon programme au cours d'une même série il sait que c'est le 5°). Est ce que le fait de prendre juste ce numéro et donc d'avoir des graines 1,2,3.....,500 suffit pour avoir une bonne répartition des nombre aléatoires ou est ce que c'est une mauvaise idée ? Comment procéder sinon ?

    Merci d'avance

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu peux avoir un ficheir contenant une graine par ligne, et indiquer au programme ce fichier.
    Tu peux carrément donner la graine en argument.

    On est bien d'accord que la graine, c'est la valeur donnée en argument à srand(), donc time().

    Sache cependant qu'avec le C++, on a (maintenant) [c]#include <random>[c], qu'on trouvais avant dans Boost.
    Tu trouveras sur cppreference toute la documentation, et des exemples.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Citation Envoyé par Blangel Voir le message
    Voila mon problème : afin de tester mon programme je lance une série de ~500 exécutions indépendantes de mon programme. Dans mon programme j'utilise la fonction rand(), préalablement initialisé via srand() et l'heure du système, je n'ai donc pas de problème ici.
    Mon problème est que, si je fait une modification du programme et que je relance une nouvelle série de 500 exécutions j'aimerais utiliser LES MÊMES graines que la première série, et dans le même ordre.
    Dans ce cas utilises le même seed à chaque fois : pas d'appel à srand, ou, utilises un seed constant.

    En C
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdlib.h>
     
    srand(0); // seed == 0 -> tu auras toujours la même suite de nombre aléatoire
    // le seed peut éventuellement venir de la ligne de commande : srand(atoi(argv[1]))
    // avec 500 appels du type :
    // prog.exe 0
    // prog.exe 1
    // ...
     
    int i = rand();

    C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <random>
     
    std::minstd_rand gen(0); // ou autre ex: std::mt19937; seed == 0, seed fixé -> même suite de nombre généré.
    // de même le seed peut venir de la ligne de commande
    std::uniform_int_distribution<int> dist(0, 50); // générer des nombres dans intervalle [0; 50]
    auto rnd = std::bind(dist, gen);
     
    int i = rnd();

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Bonjour et merci de vos réponses :

    Citation Envoyé par Iradrille Voir le message

    Dans ce cas utilises le même seed à chaque fois : pas d'appel à srand, ou, utilises un seed constant.
    Non, pour une série de 500 exécution du programme, il me faut une graine différente à chaque exécution. Mais je veux pouvoir lancer une autre série de 500 exécutions avec les mêmes seed que la premiere série.


    Tu peux avoir un ficheir contenant une graine par ligne, et indiquer au programme ce fichier.
    Tu peux carrément donner la graine en argument.

    On est bien d'accord que la graine, c'est la valeur donnée en argument à srand(), donc time().

    Sache cependant qu'avec le C++, on a (maintenant) [c]#include <random>[c], qu'on trouvais avant dans Boost.
    Tu trouveras sur cppreference toute la documentation, et des exemples.
    Oui, je suis bien d'accord que ce serait la manière la plus simple, le problème c'est que je n'ai pas l'accès en écriture à tout le code (notamment aux appel à rand()) et que je ne peux pas rajouter d'arguments, le chemin vers le fichier serait donc forcément codé en dur et j'aimerais éviter ça ...

    Est ce que vous pensez que c'est une mauvaise idée d'utiliser simplement la séquence 1,2,... 500 ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Est ce que vous pensez que c'est une mauvaise idée d'utiliser simplement la séquence 1,2,... 500 ?
    Oui d'un point de vue sécuritaire et statistique, mais sinon, non.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Oui d'un point de vue sécuritaire et statistique, mais sinon, non.

    Sécuritaire je m'en fiche, par contre statistique c'est un problème. Le but de lancer un séquence de 500 exécution est justement d'avoir assez d'échantillons pour faire des statistiques dessus ... vu qu'il s'agit d'un benchmark d'un algorithme probabiliste.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    On va faire du méta.
    Plutôt que d'utiliser la séquence 0,1,2,3,... comme seed, vous pouvez vous en servir comme le nombre de fois on doit appeler "rand" pour trouver la nouvelle graine.

    Quand 0 on fait :
    std::minstd_rand gen(0)
    ...
    int i = rnd();


    Quand 1 on fait :
    std::minstd_rand gen(0)
    ...
    int i = rnd();
    std::minstd_rand gen_finale(i)


    Quand 2 on fait :
    std::minstd_rand gen(0)
    ...
    rnd();
    int i = rnd();
    std::minstd_rand gen_finale(i)


    Quand N on fait :
    std::minstd_rand gen(0)
    ...
    for(int seq = 0;seq<N-1;seq++){ rnd();}
    int i = rnd();
    std::minstd_rand gen_finale(i)

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Ça m'a l'air intéressant, je vais donc procéder comme ça.

    merci !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/06/2006, 16h46
  2. Récupération liste de fichier pour qmail-inject
    Par segphault dans le forum Linux
    Réponses: 1
    Dernier message: 07/02/2006, 12h01
  3. tutoriel ou liste des fonctions pour GLADE
    Par debutanteVB.NET dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 23/11/2005, 16h08
  4. Réponses: 2
    Dernier message: 21/11/2005, 15h42

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