如何使用多个种子值生成随机数?

3

我需要根据多个种子值生成随机数,需要一些关于如何实现的灵感。

举个例子:假设你正在编写一个过程生成的科幻游戏,需要在玩家进入某个太阳系时创建行星(大小、类型、资源等)。你有一个游戏 ID 和该行星的 X、Y、Z 坐标。现在问题是给随机数生成器提供什么数据?当然不能简单地将这些数字相加,否则行星 (1,2,3) 就会与行星 (3,2,1) 完全相同。那么程序员应该怎么办呢?


1
有没有任何理由不直接使用时间作为种子?你需要可重复的结果吗? - Fred Foo
为什么每次想要一个新的随机数都需要一个新的种子?只需在程序开始时种子一次即可;这就是随机生成器的设计原理。 - Mr Lister
1
@larsmans,是的,我想要可再现的结果! - CodeOrElse
@MrLister 如果我一开始就播种,结果将无法再现,因为我无法一次生成整个星系。我需要逐个生成太阳系,而且我不知道玩家将以什么顺序探索这些系统。 - CodeOrElse
"mercenne_twister_engine类可以通过两种方式进行种子初始化 - 使用单个无符号长整型值或使用seed_seq实例,该实例包装了任意大的整数数组。"也许这就是我正在寻找的! :) 现在需要弄清如何使用它,因为文档很少... - CodeOrElse
1个回答

3
假设您每次都需要相同的种子来生成坐标集:可以使用MD5或其他哈希算法对连接的字符串进行加密。 md5(“1,2,3”)与md5(“3,2,1”)不同。如果您需要纯数字字符串,请使用类似于:“第一个数字* 9”+“第二个数字* 8”+“第三个数字* 7”的方法,这将给您更多的变化。
如果您不需要相同的种子,则可以使用上述方法与随机数一起使用。在这种情况下,伪随机就足够了。

1
为什么不用“第一位数字×100 + 第二位数字×10 + 第三位数字”? - Mr Lister
这是一个不错的想法!再加入一点伪随机性,怎么样? - CodeOrElse
1
我尝试了"seed = gameid + x * 4444 + y * 2222",但结果非常糟糕,根本不随机... 然后将4444替换为1234,将2222替换为5678,现在看起来相当不错.. :) - CodeOrElse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接