我正在玩一款纸牌游戏,我需要洗牌算法来做得很好,每次游戏运行时都不同,并且没有可预测的纸牌序列。
我正在使用Mersenne twister算法,但它仍然需要一个种子,所以说真的,尽管它产生了很大的数字,但由于我使用时间(NULL(进行种子,现在只有1000个可能的游戏序列。我应该如何播种?
我的标准播种技术:
-
如果存在
/dev/urandom
,则从中读取种子。 -
如果您在Windows中,请使用
CryptGenRandom()
。 -
如果所有其他操作都失败,请使用
time()
。
(不确定Mersenne twister来自哪里,但新的标准库在<random>
中有一个,它集成得非常优雅。(
我很高兴听到关于前两个步骤未涵盖的平台的建议!
您可以使用操作系统的熵源来获得一个好的随机数种子。在Windows上,这就是CryptoAPI;在POSIX上,从/dev/urandom
中提取字节。
一个典型的种子值是64位当前时间中的低32位。例如,使用Linux gettimeofday调用的返回值。