2017-10-14 2 views
0

je trouve une méthode de génération de nombres aléatoires uniformes dans la gamme (aa, bb) comme ci-dessous:nombres aléatoires uniformes sont les mêmes dans tous les essais

#include <random> 
double randnum (double aa, double bb) //defining a function to create random numbers 
{ 
    static std::default_random_engine generator; 
    std::uniform_real_distribution<double> distribution (aa,bb); 
    return distribution(generator); 
} 
    int main(){ 
for (i=1;i<50;i++){ 
    cout<< randnum(0,1); 
} 
    } 

Par exemple, RandNum (0,1); crée un nombre aléatoire entre 0 et 1. Le problème est que, pendant les différentes courses, la séquence aléatoire que je crée dans la boucle for est exactement la même. Comment puis-je créer différents nombres aléatoires au cours de différentes courses?

+3

Vous recréer le générateur chaque appel, la réinitialisation de la graine. –

+0

Comment puis-je l'éviter? @Someprogrammerdude –

+1

Vous avez besoin d'une source externe d'entropie, car le moteur aléatoire est pesudo random –

Répondre

2

Utilisez un moteur de nombres aléatoires non-déterministe pour ensemencer un plus performant, une déterministe, comme la torsion de Mersenne:

#include <iostream> 
#include <random> 

double randnum (double aa, double bb) { //defining a function to create random numbers 
    static std::random_device rd; // non-deterministic, but may be slow 
    static std::mt19937 engine{ rd() }; 
    std::uniform_real_distribution<double> distribution (aa,bb); 
    return distribution(engine); 
} 

int main() { 
    for(int i=1; i<50; i++) { 
     std::cout<< randnum(0,1); 
    } 
} 

https://ideone.com/dgvarY

+0

Oui bien sûr, j'ai oublié de l'ajouter. – Jodocus