2015-11-01 237 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));