std :: uniform_int_distribution不够随机

时间:2014-05-10 17:15:05

标签: c++ c++11 random

我想在n个数字中随机选择一个整数,其中n很小(比如5)。为此,我使用的是std::uniform_int_distribution

分布的确切细节并不重要,但我希望结果是随机的并使用范围内的所有整数。随机选择将比范围的长度(大小)多进行。我希望选择快速完成并随机

但是,无论我运行多少次,我都会收到相同的输出。为了获得不同的输出,我让一些时间过去然后再次尝试:结果仍然相同(可能这段代码不受时间影响)。

预计每次使用uniform_int_distribution时我都会获得相同的输出吗?

由于uniform_int_distribution特别不是我需要的(我只需要随机数),我尝试使用我的pseudosite中的RandomUniform。虽然我得到的结果与std::uniform_int_distribution产生的结果不同,但当我再次运行它时,它每次产生相同的数字。当然,我使用了相同的主。

我没有发布RandomUniform,为了不让帖子更大。

4 个答案:

答案 0 :(得分:8)

尝试播种随机引擎。时间是个不错的选择。您可以阅读this以了解其他播种方式。

std::default_random_engine generator( (unsigned int)time(0) );

或者你可以使用试图产生非确定性随机数的std::random_device

std::default_random_engine generator( std::random_device{}() ); 
  

std :: random_device是一个均匀分布的整数随机数   生成非确定性随机数的生成器。

     

注意,std :: random_device可以用a来实现   伪随机数引擎,如果是非确定性源(例如,   硬件设备)不适用于实现。

它绑定到硬件随机生成器设备或生成伪随机数。种子很有用。

答案 1 :(得分:3)

您没有为default_random_engine播种,所以它使用默认的常量种子。

答案 2 :(得分:1)

正如其他人所说,你的主要问题是你没有播种引擎。我想我会解决别的问题,因为你注意到速度和质量对你很重要。

与其他引擎不同,default_random_engine不做任何保证。如果您有任何合理的要求,请不要使用它。只有当你不知道自己在做什么并且它的应用并不重要时,它才会存在。从标准:

  

备注:此typedef命名的引擎类型的选择是   实施德网络定义。 [注意:实现可以选择此类型   基于性能,尺寸,质量或这些的任何组合   因素,以便提供至少可接受的发动机行为   相对休闲,不熟练和/或轻量级使用。因为不同   实现可以选择不同的底层引擎类型,代码   使用此typedef不需要生成相同的序列   实现。 - 结束说明]

更好的选择可能是mt19937,它具有高质量且速度非常快。

答案 3 :(得分:1)

如上所述,我应该为发电机播种。请注意,reference没有为种子提供明显的东西。

工作代码为here

请注意,如答案中所述,应使用mt19937,以提高速度和质量。

第一个回答中的示例here

这是互联网上发现的另一个example编译。