为纸牌游戏正确地播种RNG

Properly seeding a RNG for a card game

本文关键字:RNG 正确地 纸牌游戏      更新时间:2023-10-16

我正在玩一款纸牌游戏,我需要洗牌算法来做得很好,每次游戏运行时都不同,并且没有可预测的纸牌序列。

我正在使用Mersenne twister算法,但它仍然需要一个种子,所以说真的,尽管它产生了很大的数字,但由于我使用时间(NULL(进行种子,现在只有1000个可能的游戏序列。我应该如何播种?

我的标准播种技术:

  1. 如果存在/dev/urandom,则从中读取种子。

  2. 如果您在Windows中,请使用CryptGenRandom()

  3. 如果所有其他操作都失败,请使用time()

(不确定Mersenne twister来自哪里,但新的标准库在<random>中有一个,它集成得非常优雅。(

我很高兴听到关于前两个步骤未涵盖的平台的建议!

您可以使用操作系统的熵源来获得一个好的随机数种子。在Windows上,这就是CryptoAPI;在POSIX上,从/dev/urandom中提取字节。

一个典型的种子值是64位当前时间中的低32位。例如,使用Linux gettimeofday调用的返回值。