Random 带>;用于52张牌组洗牌的64位种子

Random 带>;用于52张牌组洗牌的64位种子,random,shuffle,Random,Shuffle,在编写洗牌算法时,我意识到有52个!~=2^225可能发生的洗牌。鉴于此,在我看来,任何基于带有标准32位或64位种子的PRNG的洗牌算法都只能产生所有可能洗牌的子集。由于我的平台只有一个32位种子PRNG(只有POSIX srandom()/random()函数),我想知道是否有办法创造性地使用它来创建一个能够产生任何结果的洗牌算法。如果没有,是否有人知道PRNG算法能够使用一个种子,它是我可以自己实现的几个32位整数的组合?有趣的问题。如果在Linux上,/dev/urandom甚至/dev

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

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

但是,也要研究在cstdlib或stdlib.h中提供的mrand48()函数家族,无论是否在Linux上。这就得到了48位,这更接近你想要的


祝你好运。

如果你想用当前的随机数生成器解决你的问题,你只需要找到一种方法,将所有可能的牌洗牌的参数空间分成若干组

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

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

(参数集不必是种子大小的偶数倍,这样才能工作。)


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

也许完整的解释太长了,但我很好奇。为什么您的解决方案有效?您的解决方案与从同一个生成器生成随机数对的错误解决方案有何不同?毕竟,使用两个不同的种子不会使生成器的确定性降低,是吗?(我想你是对的,但我有兴趣了解原因。)在物理学中,问题的参数空间很容易分组。在您的情况下,您可能会将每个单独的卡牌洗牌选项除以以下情况:卡牌1未排列,卡牌2未排列,等等。然后您生成一个未排列的随机数,然后生成一个您想要在该组中进行特定排列的实随机数。我不相信这会使随机生成或多或少具有确定性。而且。。。如果是的话,那对我来说学习是很重要的。所以我想这在原则上是可能的。我必须考虑如何实际实现这一点来解决洗牌的问题。有许多内部状态>226位的RNG。最受欢迎的可能是Mersenne Twister和Marsaglia xorshift+。