c++ 如何根据多个整数参数创建伪随机数?

ujv3wf0j  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(134)

我的总体目标是创建一个基于回合的游戏。所以,我需要一些看似随机生成的数字,例如在战斗中-但不仅是,有一些不同的场合。无论如何,我希望这些数字是可靠的相同,如果某些参数是相同的。
这些参数将是一个整数种子--它将取generalRandomSeed的值,每一轮都改变;但是我需要更多的参数,比如攻击者和防御者的ID。我会非常方便地用参数(可能都组合在一个vector中)调用这个函数,比如getRandom(generalRandomSeed,id1,id2)
所以,最后我希望有一个函数可以接受一个或多个int作为参数(理想情况下是vector),返回一个整数:int getRandom(std::vector<int> parameters) ;
我想不出怎样才能解决那个问题如果只有一个参数,我可能每次都用我的seed generalRandomSeed创建一个新的mt 19937。

r7xajy2e

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上的floatdouble有效)。

rsl1atfo

rsl1atfo2#

显然,它确实是我正在寻找的seed_seq。

相关问题