2012-04-13 7 views
2

Ich versuche, die Zahl aus einer gleichmäßigen Verteilung der reellen Zahl im Bereich von [0, 1) zu generieren. Der Compiler erzeugt jedoch Zahlen, die außerhalb des [0, 1] Bereichs liegen. Hierout of range Zufallszahlengenerierung in C++ mit tr1

ist der Code:

int main(void) { 
    // Solver solve; 

    mt19937 mteng; 
    mteng.seed(rdtsc()); 
    uniform_real<double> uniRealD; 

    double randomNum; 

    for (int index = 0; index < 10; index++){ 
     randomNum = uniRealD(mteng); 

     if(randomNum<0.5) 
      cout<<index<<" no. random number is: "<<randomNum<<endl; 
     else 
      cout<<"number generate is not in range"<<endl; 
    } 

    return 0; 
} 

Alle Kommentare auf das, was mit dem Code falsch sein könnte? Ich benutze rdtsc() als Samen.

+0

Welche Zahlen erhalten Sie? – sarnold

+0

hier sind die Zahlen: 2.59366e + 09, 2.34439e + 09, 3.48634e + 09, 3.36609e + 09, 3.68728e + 09, 1.83477e + 09, 3.47004e + 09, 1.14211e + 09, 2.24305e + 09, 1.05343e + 09, – cHaTrU

+0

haben das schon gemacht! :) – cHaTrU

Antwort

2

hatte ich von deiner Samen Funktion, um loszuwerden, rdtsc(), einige gehören zu machen, führe ein using namespace std, und ein 0,5 bis 1,0 ändern, und uniform_real-uniform_real_distribution ändern, aber danach, mit libC++, erhalte ich:

#include <random> 
#include <iostream> 

using namespace std; 

int main(void) { 
    // Solver solve; 

    mt19937 mteng; 
    mteng.seed(0); 
    uniform_real_distribution<double> uniRealD; 

    double randomNum; 

    for (int index = 0; index < 10; index++){ 
     randomNum = uniRealD(mteng); 

     if(randomNum<1.0) 
      cout<<index<<" no. random number is: "<<randomNum<<endl; 
     else 
      cout<<"number generate is not in range"<<endl; 
    } 

    return 0; 
} 

0 no. random number is: 0.592845 
1 no. random number is: 0.844266 
2 no. random number is: 0.857946 
3 no. random number is: 0.847252 
4 no. random number is: 0.623564 
5 no. random number is: 0.384382 
6 no. random number is: 0.297535 
7 no. random number is: 0.056713 
8 no. random number is: 0.272656 
9 no. random number is: 0.477665 
+0

yup, Samen ist in Ordnung. Ich würde dir sogar empfehlen, es zu benutzen. Fast jedes Mal ein einzigartiger Samen. Bezüglich des Fehlers gibt es ein Problem mit der Bibliothek wie zuvor erwähnt. Danke. – cHaTrU

+1

@cHaTrU Die zwei Möglichkeiten, wie ich Samen bekommen kann, sind (ausführlich) 'mt19937 (std :: chrono :: high_resolution_clock :: now(). Time_since_epoch(). Count())' oder (kurz) 'mt19937 ((Std: : random_device())()) ' – bames53

+0

Warum müssen Sie' uniform_real' in 'uniform_real_distribution' ändern? –

1
if(randomNum<0.5) 
     cout<<index<<" no. random number is: "<<randomNum<<endl; 
    else 
     cout<<"number generate is not in range"<<endl; 

Ändern der if Anweisung if(randomNum < 1.)

+0

aber das hätte keinen Einfluss auf die generierten Zahlen, oder? tat das und immer noch das Gleiche. Ich probierte sogar mit dem Bereich uniform_real uniRealD (0, 1), aber auch das hat keine Wirkung. – cHaTrU

2

Der Code sollte nicht so tun. Wahrscheinlich ein Fehler in der Implementierung. Welche Compiler- und Bibliotheksversionen? Versuche, dich von tr1 nach C++ 11 zu bewegen.

+0

Compiler: gcc 4.6.1 und Bibliothek: tr1/zufällig Wie gehe ich nach C++ 11 ??? – cHaTrU

+0

@cHaTru Pass '-std = C++ 0x' auf der Kommandozeile – Potatoswatter

+0

@cHaTrU In der Tat scheint das zu beheben. Auf IDEOne GCC 4.5.1 erzeugt die Verwendung von TR1 den Fehler, aber die Änderung in "std" liefert korrekte Ergebnisse: http://ideone.com/EYKao – Potatoswatter