我一直在阅读Game Coding Complete(第 4 版),但在第 3 章的“Grab Bag of Useful Stuff”部分中理解“Pseudo-Random Traversal of a Set”路径时遇到了一些问题。
您有没有想过 CD 播放器上的“随机”按钮是如何工作的?它会随机播放您 CD 上的每首歌曲,而不会将同一首歌曲播放两次。这是一个非常有用的解决方案,可以确保游戏中的玩家在有机会再次看到相同的特征之前看到最广泛的特征,例如对象、效果或角色。
在此描述之后,它继续讨论我尝试在 Java 中实现但无法成功复制的 C++ 实现。它还简要描述了它的工作原理,但我也不明白。
我发现这个StackOverflow 回答了一个类似的问题,但不幸的是,答案中的示例链接已经失效,我也不理解 Wikipedia 文章,尽管关于它所做的描述似乎描述了我正在寻找的内容。
需要明确的是,我不是在寻找一种随机重新排序集合的方法。我正在寻找一种在重复之前从集合中随机选择一个元素的方法。
有人可以解释这种行为是如何工作的并提供一个 Java 示例吗?谢谢!
[编辑] 我认为在此处摘录实现可能很有用,以帮助解释我在说什么。
这是它的工作原理。通过选择三个大于零的随机值来计算跳过值。这些值成为二次的系数,域值 (x) 设置为集合的序数值:
Skip = RandomA * (members * members) + (RandomB * members) + RandomC
有了这个跳过值,您可以使用这段代码以伪随机顺序遍历整个集合一次:
nextMember += skip;
nextMember %= prime;
skip 的值远大于集合中的成员数,以至于所选值似乎随机跳过。当然,这段代码在一个 while 循环中,以捕捉所选值大于您的设置但仍小于质数的情况。