我有三个关于RNG的问题。
第一个问题是哪些数据可以用作种子。我一直在使用时间,但肯定还有其他容易获得的种子。
在c++中有哪些容易获得的种子?
如果我根据RNG的下一个值以随机间隔重新播种RNG,并从问题1的答案中随机选择种子,这是否会创建一个更难预测的伪随机链,因此更具随机性?
最后,在c++中获取某个范围内的随机数的最佳方法是什么?我一直在使用模运算符,但我想要的是在范围内均匀分布的东西,而不是像AI决策那样偏爱高或低。
发布于 2011-06-22 20:19:13
你应该看看boost::random。
请记住:
我希望您可以简单地使用boost::mt19937,但这实际上取决于应用程序。
发布于 2011-06-22 20:43:32
RNG的一个容易获得的种子是任意时间函数。种子不需要是随机的,只要你每次启动程序时它都是不同的,这就足够好了。试图使伪随机数变得“更随机”是一种有点愚蠢的尝试。如果需要这样做,那么生成器是不值得的。
此外,除非经常用真随机噪声播种,否则你不会让输出变得更“随机”,如果你定期播种真随机噪声,只有种子将是真正随机的,其他值仍然是确定性的,所有这些都具有与该生成器生成的任何其他序列相同的统计属性。
如果不能接受不对称分布,通常的实现是在非2次幂范围内获取数字,如下所示:
range = high - low;
while((r = rand()) > range) {}
r += low;模运算和乘法/除法存在众所周知的偏差和溢出问题。
但是,如果像你说的那样是为了人工智能决策,我敢说如果一个结果比另一个高出1%的可能性,没有人会注意到。因此,简单地使用模数可能就足够好了,具有确定性的时间,并且非常简单。还要注意的是,你总是可以选择一个适合模数的范围。
发布于 2011-06-22 20:18:39
对于大多数应用程序来说,时间是足够好的,如果你需要更好的随机数,那么你应该看看提供这种功能的特定库。
对于范围生成,以下内容不会影响结果:
int random = rand() * RANGE / RAND_MAX;
https://stackoverflow.com/questions/6439626
复制相似问题