我在给一个在线扑克游戏编程。洗牌部分采用Fisher Yates算法。但是我不知道哪个随机数发生器能产生很好的不可预测的随机数,供洗牌算法使用。52张卡片有52!~= 8.065e67可能的序列。
发布于 2017-09-07 09:39:49
8e+67是一个很大的数字,但它的数据大小并不高。它只有226位的数据长度。28字节
您可以考虑使用CSPRNG,一种加密强伪随机生成器,即产生足够强随机性以用于密码学的RNG。
有时CPU也有一个真正的随机数源,它是快速的。我在这里描述CSPRNG。
在Linux上,您可以简单地从/dev/urandom字符设备文件中读出随机字节。
发布于 2017-09-07 16:46:00
正如您所指出的,您应该使用一个远远超过52!可能的内部状态,这意味着226位状态。有许多PRNG超过这一点,有1024位或更多的状态。你也想要一些快速的东西,这样你就可以模拟数百万的手。满足这些标准的最流行的算法是Mersenne。我个人也喜欢Marsaglia的XORshift变体。
我通常只使用硬件真正的RNG(现在大多数个人电脑)用于加密和播种这些PRNG,但我被告知,一些更好的RNG足够快,甚至为模拟产生价值。你得查一下你的硬件。
https://stackoverflow.com/questions/46092843
复制相似问题