为卡牌游戏正确播种 RNG
我正在开发一款纸牌游戏,我需要洗牌算法能够很好地完成工作,并且每次游戏运行时都不同,并且没有可预测的纸牌序列。
我正在使用梅森扭曲算法,但它仍然需要种子,所以实际上,尽管它产生大量数字,但由于我使用时间(NULL)作为种子,现在只有 1000 个可能的游戏序列。我应该如何播种?
I'm working on a card game and I need the shuffle algorithm to do a very good job and to be different every time the game runs and to not have predictable card sequences.
I'm using the Mersenne twister algorithm but it still needs a seed, so really, although it produces great numbers, right now there are only 1000 possible sequences of games since I'm using time(NULL) to seed. How should I be seeding?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我的标准播种技术:
如果
/dev/urandom
存在,从那里读取种子。如果您使用的是 Windows,请使用
CryptGenRandom()
。如果所有其他方法都失败,请使用
time()
。(不确定你的梅森扭曲器来自哪里,但是新的标准库中有一个
,它集成得非常优雅。)我很高兴听到对未涵盖的平台的建议前两步!
My standard seeding technique:
If
/dev/urandom
exists, read a seed from there.If you're in Windows, use
CryptGenRandom()
.If all else fails, use
time()
.(Not sure where your Mersenne twister comes from, but there new standard library has one in
<random>
which integrates very elegantly.)I'm happy to hear suggestions for platforms that aren't covered by the first two steps!
您可以使用操作系统的熵源来获得良好的随机数种子。在 Windows 上,这是 CryptoAPI;在 POSIX 上,从
/dev/urandom
中提取字节。You can use the operating system's entropy source to get a good random number seed. On Windows, that's CryptoAPI; on POSIX, pull bytes from
/dev/urandom
.典型的种子值是 64 位当前时间中的低 32 位。例如使用 Linux gettimeofday 调用的返回值。
A typical seed value is the low 32 bits in a 64 bit current time. For example Use the return value of Linux gettimeofday call.