【问题标题】:std::uniform_int_distribution isn't random enoughstd::uniform_int_distribution 不够随机
【发布时间】:2014-05-10 17:15:05
【问题描述】:

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

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

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

是否每次我使用uniform_int_distribution 都会得到相同的输出?

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

我没有发布 RandomUniform,以免使帖子变得更大。

【问题讨论】:

  • 每次运行程序时,您都使用相同的 rng 种子。因此,期望获得相同的输出。您需要为 rng 播种一些预计会有所不同的内容,例如时间。
  • 感谢@pinkfloydx33 的回复,希望我不能只支持您的评论。
  • 我的问题被否决了。为什么?我应该删除它吗?
  • 请不要在您的问题中包含答案。毕竟这是一个问题。
  • @QPaysTaxes 谢谢,但我看到了答案以及我的问题中的内容,不清楚我应该发布什么。 ://

标签: c++ c++11 random


【解决方案1】:

尝试为随机引擎播种。时间是一个不错的选择。阅读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 可以按照 伪随机数引擎,如果是非确定性源(例如 硬件设备)对实现不可用。

它使用硬件随机生成器设备或生成伪随机数。对播种很有用。

【讨论】:

  • 感谢 M²!我认为您可以通过解释一下random_device 是什么来改进您的答案。在链接中不明显。
  • 我的问题被否决了。为什么?我应该删除它吗?谢谢你的解释。
  • @G.Samaras:不,你不能,因为问题有答案。您可以改进您的帖子以说服反对者删除他的反对票。 (顺便说一句,我不知道这是什么原因)
  • 我想会有人和我有同样问题的人。我希望他找到他正在寻找的东西。我会编辑,但只是一点点。再次感谢。
【解决方案2】:

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

【讨论】:

  • 你是对的,第一个回答。但是,M² 的答案更完整,因为他说如何播种。这就是为什么我会接受这个答案。我认为这是公平的。 :)
【解决方案3】:

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

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

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

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

【讨论】:

【解决方案4】:

如前所述,我应该为生成器播种。请注意,reference 没有为种子提供明显的信息。

工作代码是here

请注意,如答案中所述,应使用mt19937,以获得更好的速度和质量。

第一个答案中的示例here

这是另一个example,在互联网上找到,可以编译。

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2020-01-31
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多