<伪随机数发生器>&gt; 64位种子用于52卡牌组洗牌

时间:2012-03-25 19:44:46

标签: random shuffle

在编写卡片洗牌算法时,我意识到有52个! 〜= 2 ^ 225可能发生的混乱。鉴于此,在我看来,基于具有标准32位或64位种子的PRNG的任何改组算法将仅能够产生所有可能的混洗的子集。由于我的平台只有一个32位种子PRNG(只是POSIX srandom()/ random()函数),我想知道是否有任何方法可以创造性地使用它来创建一个能够产生任何结果的混洗算法。如果没有,有没有人知道能够使用种子的PRNG算法,这种算法是我自己实现的几个32位整数的组合?

2 个答案:

答案 0 :(得分:1)

有趣的问题。如果在Linux上, / dev / urandom 甚至 / dev / random 可能适合。这些设备依赖于“熵池”,由异步硬件事件的定时提供。

但是,还要研究 mrand48()系列函数,无论是否在Linux上,都在 cstdlib stdlib.h 中提供。这会让你获得48位,这更接近你想要的。

祝你好运。

答案 1 :(得分:1)

如果您想使用当前的随机数生成器来解决您的问题,您只需要找到一种方法将所有可能的卡混洗的参数空间划分为多个组。

例如,如果你有一个随机种子只能是1到4,但是一个参数空间有12种可能的排列,你可以使用两个随机种子来解决:

(seed1)定义您所在的参数组(1-4,5-8或9-12)
(seed2)定义哪个元素是您的最终结果

(参数集不必是种子大小的偶数倍,以便工作。)

我将这种方法用于固态物理建模中的非常大的复杂性问题。这是一个严格的数学解决方案,但它可能不是最优雅的软件解决方案。祝你好运。