我的总体目标是创建一个基于回合的游戏。所以,我需要一些看似随机生成的数字,例如在战斗中-但不仅是,有一些不同的场合。无论如何,我希望这些数字是可靠的相同,如果某些参数是相同的。
这些参数将是一个整数种子--它将取generalRandomSeed
的值,每一轮都改变;但是我需要更多的参数,比如攻击者和防御者的ID。我会非常方便地用参数(可能都组合在一个vector
中)调用这个函数,比如getRandom(generalRandomSeed,id1,id2)
。
所以,最后我希望有一个函数可以接受一个或多个int
作为参数(理想情况下是vector
),返回一个整数:int getRandom(std::vector<int> parameters)
;
我想不出怎样才能解决那个问题如果只有一个参数,我可能每次都用我的seed generalRandomSeed
创建一个新的mt 19937。
2条答案
按热度按时间r7xajy2e1#
为了解释Maarten关于
std::seed_seq
的问题(并确保我理解正确!),我将尝试给出答案。我建议使用它的主要问题是(听起来Maarten也有同样的想法)
std::seed_seq
使用的算法不是标准定义的,因此其他标准库也可以使用(例如,如果您使用不同的编译器,甚至是同一个编译器的不同版本)来更改实现,那么您将从相同的输入返回不同的值。根据您的用例,这种缺乏稳定性的问题可能会,也可能不会,这是一个特定领域的问题,您必须决定,因为您还没有指定它。所建议的加密方法将使用类似HKDF的东西,你使用加密哈希(如SHA 256)提取熵(即“随机性”)以确定性的方式从输入值(例如,注意字节序),然后使用另一个加密原语来“拉伸”这个熵,以产生随机输出。我们不熟悉密码学领域,这些东西可能会很笨拙,因为有很多术语。
作为一个小问题,我建议不要使用MT 19937 PRNG,因为它的种子相对昂贵,而且听起来你会经常这样做。还有其他算法便宜得多,我个人喜欢Sebastiano's xoshiro256 family,或者你可以使用Melissa's PCG family。如果你是PRNG的新手,Melissa奥尼尔的网站是一个非常有用的资源。
也就是说,如果你选择香港民主党的路线,你也可以把“扩展”步骤当作PRNG,因为它会直接产生统一的值。这些值可以很容易地转换成有界/统一的值:Melissa对
int
s here有一个很好的评价,Vigna在这里的底部描述了二进制IEEE-754浮点数的传统转换(因此对大多数常见CPU上的float
和double
有效)。rsl1atfo2#
显然,它确实是我正在寻找的seed_seq。