2013-03-17 5 views
10

Ich möchte Zufallswerte generieren können, zwischen 0,0 und 1,0std :: default_random_engine Werte zwischen 0,0 und 1,0 erzeugen

Ich habe versucht

std::default_random_engine generator; 
std::uniform_real_distribution<float> distribution(0.0, 1.0); 

float myrand = distribution(generator); 

Zufalls-Wert zu verwenden, in einer Schleife gibt mir immer diese Werte:

0.000022 

0.085032 

0.601353 

0.891611 

0.967956 

0.189690 

0.514976 

0.398008 

0.262906 

0.743512 

0.089548 

Was kann ich tun, um wirklich zufällige Werte zu bekommen? Scheint nicht zufällig, wenn ich immer die gleichen bekomme.

+0

Sieht mir ziemlich zufällig. Wo ist das Problem? – Grizzly

+0

@Grizzly: ähem: "* Scheint nicht zufällig, wenn ich immer die gleichen bekomme. *" –

+0

@NicolBolas: Sie wollen, dass es die gleichen Werte gibt. Weil das Debuggen von nicht deterministischem Code ein Schmerz ist. Aber es ist immer noch zufällig. Es ist nur pseudozufällig und Sie beginnen immer am selben Ort. Sie müssen nur den Startpunkt ändern. –

Antwort

6

Wenn Sie darauf verweisen, dass Sie bei jeder Ausführung des Programms die gleichen Ergebnisse erhalten, müssen Sie einen Startwert basierend auf einem beliebigen Zufallswert angeben (z. B. eine vom Benutzer eingegebene Nummer oder die Nummer) verstrichenen Millisekunden seit dem Computer eingeschaltet ist, oder seit dem 1. Januar 1970 usw.):

#include <random> 

std::default_random_engine generator; 
generator.seed(/* ... */); 
//    ^^^^^^^^^  
//    Provide some naturally random value here 

std::uniform_real_distribution<float> distribution(0.0, 1.0); 

float myrand = distribution(generator); 
11
// 1-st variant: using time() function for seed random distribution 
    std::default_random_engine generator(time(0)); 
    std::uniform_real_distribution<double> distribution(first, last); 
    return distribution(generator); 
    /*disadvantages: 

wenn offen mehrfach Programme, die den gleichen Zufallszahlengenerator verwenden
werden sie gibt die gleichen Ergebnisse weil sie den gleichen Wert des Samens haben, der die Zeit ist.
Dieses Problem gelöst durch gelegentliches Gerät finden Sie unter Beschreibung über: */

// 2-nd variant: 
std::uniform_real_distribution<double> distribution(first, last); 
std::random_device rd; 
std::default_random_engine generator(rd()); 
return distribution(generator); 
+1

+1 für 'random_device' - wenn Sie wissen, dass es auf den Systemen verfügbar ist, die Ihr Programm ausführen soll, mag ich diese Lösung am besten. – us2012

0

Ich habe eine andere gute Lösung gefunden ...

double Generate(const double from, const double to) 
{ 
    std::random_device rd; 

    return std::bind(
     std::uniform_real_distribution<>{from, to}, 
     std::default_random_engine{ rd() })(); 
} 
Verwandte Themen