2015-11-01 236 views
0

我想創建一個類,每當我調用它時將返回一個隨機數。但是當我把它放到一個循環中時,它每次都會返回相同的隨機數。我播種了一次,但它仍然一遍又一遍地返回。只有當我關閉程序並再次打開它時,它纔會有所不同。任何幫助將非常感激。隨機生成器,種子不工作

**編輯

當我不能看到我每次調用它。

RadomGenerator rg = new... 
for(int i =0; i<10; i++){ 
    rg.createRandomNumber(1,5);} 

這是不是隻有一次然後調用方法createRandomNumber幾次?

RandomGenerator::RandomGenerator() 
{ 
seed = time(0); 
} 

int RandomGenerator::createRandomNumber(int start, int end) 
{ 

std::function<int()> randomNumber = std::bind(std::uniform_int_distribution<int>(start,end), 
             mt19937(seed)); 
qDebug()<< "result" << randomNumber() ; 
return randomNumber(); 

} 
+2

你每次播種了。 –

+1

我相信有幾十個重複。如果你使用每秒都會改變的種子,那麼每隔一秒鐘你就會得到一個不同的序列。 – user463035818

回答

5

你正在播種它每一次。

#include <random> 

struct RandomGenerator { 
    std::mt19937 _engine; 
    std::uniform_int_distribution<int> _dist; 

    RandomGenerator(int start, int end) 
     : _engine { std::random_device{}() }, 
      _dist(start, end) 
    { 
    } 

    int createRandomNumber() 
    { 
     return _dist(_engine); 
    } 

}; 

注意,它實際上不是很有用單個呼叫建立的uniform_*_distribution一個實例要麼。

更不用說,將其包裝在function<>中。

通常可以使用一個

auto mygen = bind(,); 

而不是全班同學,並使用它:

int this_is_random = mygen(); 

在C++ 14:

auto mygen = [ _engine = mt19937{ random_device{}() }, _dist = uniform_int_distribution<>(12, 42) ]() mutable { 
    return _dist(_engine); 
}; 

看到它Live On Coliru

+0

好消息:在C++ 17或TS中有更直接的'rand()'替代方案。所以我們甚至可能會得到一些Java質量:) – sehe

+0

我想在Qt中使用頭文件實現這一點,但我不知道如何聲明支撐或它如何影響構造? –

+0

我已經包括這是一個在類中的結構,但它仍然不起作用 當我打電話給它時 RandomGenerator * ranGen = new RandomGenerator(1,3); 並將createRandomNumber放在for循環中,它仍然會多次打印出相同的數字 –

0

這是不是隻有一次然後調用方法createRandomNumber幾次?

號在這一行你mt19937每次實例化具有相同seed

std::function<int()> randomNumber = std::bind(std::uniform_int_distribution<int>(start,end), 
            mt19937(seed));