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++/CLI Discussion :

2 questions précises sur la fonction rand() [Débutant(e)]


Sujet :

C++/CLI

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 182
    Points : 52
    Points
    52
    Par défaut 2 questions précises sur la fonction rand()
    Bonsoir à toutes et à tous,

    J'ai 2 questions précises sur la fonction rand():

    1) Je dois tirer un nombre important (disons entre 200,000 et une dizaine de millions) de nombres aléatoires compris entre [0, 1]: des réels. J'ai trouvé en googlant une page qui détaille pas mal la procédure pour tirer dans un intervalle, en particulier le code de GreyWolf: http://www.cplusplus.com/forum/beginner/7445/. Ma première question, est-ce que ce type de code convient pour mon cas (grand nombre de tirages, sécurité de l'aléatoire, rapidité) ? A priori ça me semble plutôt pas mal, mais j'aimerais vos avis d'experts.

    2) Dernière question, je débute en C++, et j'ai une classe dans laquelle j'ai différentes méthodes qui tirent aléatoirement. Ma question: ou et comment dois-je initialiser la graine? dois-je déclarer une variable et le faire dans la constructeur? dois-je initialiser une graine dans chaque méthode? bref quelle est la procédure la plus sure (pour avoir de l'aléatoire) et éventuellement la plus rapide?

    Merci par avance pour vos retours,

    Gian

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    le cas du rand a été maintes fois abordés sur ces forums.
    Le principe est
    - seeder 1 et 1 seule fois
    - (float)rand() / (RAND_MAX) pour générer [0,1]

    Point de vue performance, de toutes façons tu devras effectuer tes N appels à rand pour avoir N résultats. Et sur ce point je ne vois pas énormément d'améliorations possibles.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 182
    Points : 52
    Points
    52
    Par défaut
    Merci pour ce retour éclairé et éclairant.
    Le seeder 1 et une seule fois vaut aussi pour les processus?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Qu'entends-tu par processus ?

    Il faut initialiser la seed une seule fois par programme, en particulier si tu vas tirer plusieurs rand à la suite très rapidement.

    rand est un "faux random" dans le sens où il prend la valeur suivante à partir de la seed.
    Un exemple très faux, admettons que tu aies la séquence suivante après seed
    5 2 4 0
    Si tu tires 4 rand à la suite, tu auras ces valeurs-là dans cette ordre.
    Si maintenant tu seed sur time(NULL) (classiquement), avec la même séquence, si tu rand/seed trop rapidement, tu pourras avec 4 rand/seed à la suite ne tirer que des 5 !
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    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 073
    Points : 12 119
    Points
    12 119
    Par défaut
    rand génère une série de nombre pseudo-aléatoire.

    C'est à dire qu'un attaquant qui peut accéder à un "grand" nombre des valeurs successives retournés par rand, comme les numéros de séquences des connections TCP, est capable de deviner à l'avance les prochaines valeurs retournées par rand.

    La fonction "rand" est complétement nulle d'un point de vue cryptographique.

    De plus, d'un point de vue statistique, la répartition des valeurs retournées par rand n'est pas homogène. Des valeurs sortent bien plus souvent que d'autres. C'est donc pourri pour des méthodes statistiques type Monte-Carlo.

    Vous ne pouvez faire que des programmes "jouets" avec rand. Mais je ne pense pas qu'on demande plus à un débutant en C++.

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Points : 119
    Points
    119
    Par défaut
    bonjour.

    ton projet consiste-t'il a utiliser la fonction rand()?

    ou la finalité est-elle d'obtenir la série de nombre aléatoire ?

    dans ce deuxième cas, les propriétés de ta série de nombres (pseudo) aléatoires sont très importantes.

    Boost et QuantLib ont des librairies/classes qui pourront t'intéresser.

    tu peux aussi jeter un oeil sur la série "Random Review series: randomly reviewing snippets of published codes:" de B.Nikolic, disponible ici


Discussions similaires

  1. Questions précises sur les relations
    Par chido dans le forum JPA
    Réponses: 7
    Dernier message: 29/01/2014, 16h59
  2. Question précise sur JNA
    Par astronomixlegaulois dans le forum Documents
    Réponses: 1
    Dernier message: 28/04/2010, 12h00
  3. question pratique sur les fonctions 'inutiles'
    Par Plomeg dans le forum C++
    Réponses: 13
    Dernier message: 20/11/2007, 19h58
  4. Réponses: 3
    Dernier message: 23/08/2007, 00h39
  5. Réponses: 2
    Dernier message: 21/12/2005, 09h39

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