为纸牌游戏正确地播种RNG
Properly seeding a RNG for a card game
我正在玩一款纸牌游戏,我需要洗牌算法来做得很好,每次游戏运行时都不同,并且没有可预测的纸牌序列。
我正在使用Mersenne twister算法,但它仍然需要一个种子,所以说真的,尽管它产生了很大的数字,但由于我使用时间(NULL(进行种子,现在只有1000个可能的游戏序列。我应该如何播种?
我的标准播种技术:
-
如果存在
/dev/urandom
,则从中读取种子。 -
如果您在Windows中,请使用
CryptGenRandom()
。 -
如果所有其他操作都失败,请使用
time()
。
(不确定Mersenne twister来自哪里,但新的标准库在<random>
中有一个,它集成得非常优雅。(
我很高兴听到关于前两个步骤未涵盖的平台的建议!
您可以使用操作系统的熵源来获得一个好的随机数种子。在Windows上,这就是CryptoAPI;在POSIX上,从/dev/urandom
中提取字节。
一个典型的种子值是64位当前时间中的低32位。例如,使用Linux gettimeofday调用的返回值。
相关文章:
- 如何正确地将分支添加到已存在的树中
- 如何正确地将带有指针的数组传递给函数
- 如何正确地推回然后遍历堆中对象的向量?
- 我是否不正确地集中了这些字符数组?
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 我怎样才能通过友谊正确地履行我的职能?
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- 我应该如何正确地将packaged_task移动到 lambda?
- 如何正确地将SHA1CryptoServiceProvider转换为c ++?
- 如何正确地对 constexpr 函数进行单元测试
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何正确地将boost::asio::buffers_iterator转换为InputIterator
- 如何正确地检查变量char中包含的字母
- 当试图交换可变模板类时,如何正确地重载operator=
- 如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
- 如何在C++中正确地将我的语言字符输出到HTML文件中
- 如果我的类正确地管理了一个资源,那么拥有智能的poointer有什么意义
- 如何正确地编写这些条件,以便它们在控制台中工作
- 正确地编写一个类,并将pthread与vlc库和c++一起使用
- 为纸牌游戏正确地播种RNG