【发布时间】:2014-06-24 18:54:13
【问题描述】:
我正在使用我在其他 SO 帖子中找到的一对算法(在下面的参考资料中列出),并试图找出如何改进分布。我通过将位数加倍来有效地扩展随机数的范围,并希望确保分布尽可能均匀,同时消除(或至少减少)混洗算法的模偏差和其他伪影的影响那将使用我修改后的随机数生成器的结果。
因此,据我了解,如果我使用常量种子(即:srand(1))初始化我的 RNG,我将通过在 for 循环中调用 rand() 获得相同模式的确定性输出。现在,如果我要通过srand(time(NULL)) 初始化我的种子,这将是一个不同的模式,但它仍然可能无法帮助我解决以下问题:我正在尝试弄清楚我是否要实现以下算法:
- 取两个随机数 a,b
- 计算 a*(RAND_MAX+1)+b
我可以:
- 生成每个可能的坐标对 (a,b),其中
a,b ∈ Z+ on [0, RAND_MAX](a和b是介于零和RAND_MAX之间的正整数)。 - 最大限度地提高整个分布的均匀性(即:最佳平坦直方图)。
虽然rand() 的输出应该是均匀分布的,但我不知道它是否保证给我 N,N+1 调用的值以对每个循环进行 rand 每个循环并给我每对列出的点 (1 ) 在随机序列再次重复之前。 我的新随机数生成器理论上可以在[0, RAND_MAX ^ 2] 上生成随机值,但我不知道在这个范围内是否可能存在我的算法永远无法生成的“洞”,即值。
我自己试图进一步解决这个问题,但我找不到有关在 C 中生成的随机序列 rand() 会持续多长时间直到它重复自身的信息。由于缺少这些信息和其他信息,我无法确定是否可以生成每一对 (a,b)。
那么,使用rand(),是否有可能达到第(1)点,如果可以,是否有关于如何根据第(2)点优化其“随机性”的可靠建议?
感谢您的时间和帮助。
更新
我后来重新审视了这个问题,并使用 8 位 PRNG 对其进行了模拟。虽然它确实可以生成所有可能的坐标对,但分布实际上非常有趣,而且绝对不均匀。最后,我阅读了几篇关于 PRNG 的文章/论文,并使用 Mersenne Twiser 算法生成所需的额外位(即 MT19937-64)。
参考文献
-
扩展 rand() 最大范围,于 2014 年 5 月 7 日访问,
<https://stackoverflow.com/questions/9775313/extend-rand-max-range> -
C 中的随机数组,于 2014 年 5 月 7 日访问,
<https://stackoverflow.com/questions/6127503/shuffle-array-in-c>
【问题讨论】:
-
虽然我通常很欣赏编辑,但我更喜欢不删除引用,因为我希望它们保持 IEEE 格式,这样如果问题是逐字复制/粘贴,则学分是人类可读的格式。另外,我认为他们应该尽可能在场。
-
Information on how long a random sequence generated-> 取决于 RNG。对于梅森捻线机,the period is 2^19937-1。默认实现看起来像是一个 LCG,这肯定不是那么好。 -
一定要使用
rand()吗?它的属性是依赖于实现的,正如您所注意到的,不能保证非常好。 -
关于链接的讨论属于 Meta,所以我在那里发布了一个问题 (meta.stackoverflow.com/questions/253976/…)。 (我的个人观点或许可以从我对这个问题的表述中推断出来。)
-
“我的新随机数生成器...在 [0, RAND_MAX ^ 2] 上生成随机值”不正确。它可能在区间 `[0, ((RAND_MAX + 1) ^ 2 - 1)] 上生成。
标签: c algorithm random statistics