我想在n个数字中随机选择一个整数,其中n很小(比如5)。为此,我使用的是std::uniform_int_distribution
。
分布的确切细节并不重要,但我希望结果是随机的并使用范围内的所有整数。随机选择将比范围的长度(大小)多进行。我希望选择快速完成并随机。
但是,无论我运行多少次,我都会收到相同的输出。为了获得不同的输出,我让一些时间过去然后再次尝试:结果仍然相同(可能这段代码不受时间影响)。
预计每次使用uniform_int_distribution
时我都会获得相同的输出吗?
由于uniform_int_distribution
特别不是我需要的(我只需要随机数),我尝试使用我的pseudosite中的RandomUniform。虽然我得到的结果与std::uniform_int_distribution
产生的结果不同,但当我再次运行它时,它每次产生相同的数字。当然,我使用了相同的主。
我没有发布RandomUniform,为了不让帖子更大。
答案 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)