首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将种子随机化会产生更随机的数字吗?

将种子随机化会产生更随机的数字吗?
EN

Stack Overflow用户
提问于 2011-06-22 20:14:58
回答 3查看 746关注 0票数 2

我有三个关于RNG的问题。

第一个问题是哪些数据可以用作种子。我一直在使用时间,但肯定还有其他容易获得的种子。

在c++中有哪些容易获得的种子?

如果我根据RNG的下一个值以随机间隔重新播种RNG,并从问题1的答案中随机选择种子,这是否会创建一个更难预测的伪随机链,因此更具随机性?

最后,在c++中获取某个范围内的随机数的最佳方法是什么?我一直在使用模运算符,但我想要的是在范围内均匀分布的东西,而不是像AI决策那样偏爱高或低。

EN

回答 3

Stack Overflow用户

发布于 2011-06-22 20:19:13

你应该看看boost::random

请记住:

  • 为什么你需要随机数--是为了安全,还是为了一个随机过程?
  • 你说的“更随机”是什么意思?
  • 如果你根据一种算法重新播种,并且该算法比潜在的随机数更可预测,那么你的情况比你开始时更糟糕。如果你的种子仅仅是32位的值,那么即使是一个真正随机的种子源也会让事情变得更糟,而不是更好!
  • 如果你需要从随机源中“混合”额外的随机性,那么通过异或来做可能会更好:例如,保持一个真正随机数的小垫子,并将它们循环地异或到你的RNG的输出中-而不是偶尔重新播种,偶尔重新生成那个垫子。这样,您就不会丢弃RNG的宝贵内部状态。或者,如果您可以访问RNG内部,可以使用真正的随机源,偶尔通过类似的机制旋转一些位。

我希望您可以简单地使用boost::mt19937,但这实际上取决于应用程序。

票数 2
EN

Stack Overflow用户

发布于 2011-06-22 20:43:32

RNG的一个容易获得的种子是任意时间函数。种子不需要是随机的,只要你每次启动程序时它都是不同的,这就足够好了。试图使伪随机数变得“更随机”是一种有点愚蠢的尝试。如果需要这样做,那么生成器是不值得的。

此外,除非经常用真随机噪声播种,否则你不会让输出变得更“随机”,如果你定期播种真随机噪声,只有种子将是真正随机的,其他值仍然是确定性的,所有这些都具有与该生成器生成的任何其他序列相同的统计属性。

如果不能接受不对称分布,通常的实现是在非2次幂范围内获取数字,如下所示:

代码语言:javascript
复制
range = high - low;

while((r = rand()) > range) {}

r += low;

模运算和乘法/除法存在众所周知的偏差和溢出问题。

但是,如果像你说的那样是为了人工智能决策,我敢说如果一个结果比另一个高出1%的可能性,没有人会注意到。因此,简单地使用模数可能就足够好了,具有确定性的时间,并且非常简单。还要注意的是,你总是可以选择一个适合模数的范围。

票数 1
EN

Stack Overflow用户

发布于 2011-06-22 20:18:39

对于大多数应用程序来说,时间是足够好的,如果你需要更好的随机数,那么你应该看看提供这种功能的特定库。

对于范围生成,以下内容不会影响结果:

int random = rand() * RANGE / RAND_MAX;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6439626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档