什么RNG(随机数生成器)算法适合扑克牌洗牌?
What RNG(random number generator) algorithm suits for poker cards shuffle?
我正在编写一个在线扑克游戏。洗牌部分使用 Fisher Yates 算法。但是我不知道哪个随机数生成器可以生成良好的不可预测的随机数供改组算法使用。
52张牌有52张! ~= 8.065e67 个可能的序列。
8e+67
是一个很大的数字,但数据量不是很大。它的数据长度只有 226 位。 28 个字节。
您可以考虑使用 CSPRNG,一种加密强度高的伪随机生成器,即生成足够强的随机性以用于加密的 RNG。
有时 CPU 也有一个真正的随机数源,速度很快。这里我描述一下CSPRNG。
在Linux上,您可以简单地从/dev/urandom
字符设备文件中读取随机字节。
正如您所指出的,您应该使用一个远远超过 52 的!可能的内部状态,这意味着 226 位状态。有许多 PRNG 超过此值,具有 1024 位或更多位的状态。您还需要快速的东西,这样您就可以模拟数百万只手。满足这些标准的最流行的算法是 Mersenne Twister。我个人也喜欢 Marsaglia 的 XORshift 的变体。
我通常只使用硬件真正的 RNG(现在大多数 PC 都有)来进行加密和为这些 PRNG 播种,但我听说一些更好的 RNG 速度足够快,甚至可以为模拟生成值。你必须为你的硬件查找它。
我正在编写一个在线扑克游戏。洗牌部分使用 Fisher Yates 算法。但是我不知道哪个随机数生成器可以生成良好的不可预测的随机数供改组算法使用。 52张牌有52张! ~= 8.065e67 个可能的序列。
8e+67
是一个很大的数字,但数据量不是很大。它的数据长度只有 226 位。 28 个字节。
您可以考虑使用 CSPRNG,一种加密强度高的伪随机生成器,即生成足够强的随机性以用于加密的 RNG。
有时 CPU 也有一个真正的随机数源,速度很快。这里我描述一下CSPRNG。
在Linux上,您可以简单地从/dev/urandom
字符设备文件中读取随机字节。
正如您所指出的,您应该使用一个远远超过 52 的!可能的内部状态,这意味着 226 位状态。有许多 PRNG 超过此值,具有 1024 位或更多位的状态。您还需要快速的东西,这样您就可以模拟数百万只手。满足这些标准的最流行的算法是 Mersenne Twister。我个人也喜欢 Marsaglia 的 XORshift 的变体。
我通常只使用硬件真正的 RNG(现在大多数 PC 都有)来进行加密和为这些 PRNG 播种,但我听说一些更好的 RNG 速度足够快,甚至可以为模拟生成值。你必须为你的硬件查找它。