我一直在阅读《游戏编码完全手册(第4版)》,但我对第3章的“ Grab Bag of Useful Stuff”部分中“ Pseudo-Random Traversal of a Set”路径有一些困惑。
你是否曾经想过CD播放器上的“随机”按钮如何工作?它会随机播放CD上的每首歌曲,而不重复播放同一首歌曲。这是确保游戏玩家在看到相同元素之前先看到最广泛的对象、效果或角色等各种功能的非常有用的解决方案。
在描述完这一点后,它继续讨论了C++的实现方法。我试着在Java中实现它,但没有成功地复制它。它也简单描述了它的工作原理,但我也不明白。
我发现了一个类似问题的StackOverflow答案,但不幸的是,答案中的示例链接已经失效了,我也不理解Wikipedia文章,虽然它关于它的描述似乎描述了我正在寻找的内容。
明确一下,我不是在寻找一种重新排列集合的随机方法。我正在寻找一种从集合中随机选择一个元素,只选取一次后再重新开始的方法。
有人能解释一下它的工作原理并在Java中提供一个示例吗?谢谢!
[编辑] 我想把实现的摘录放在这里,以帮助解释我在说什么。以下是其工作原理。通过选择三个大于零的随机值计算跳过值。这些值成为二次方程的系数,域值(x)设置为集合的序数值:
使用这个跳过值,您可以使用以下代码遍历整个集合,恰好一次以伪随机顺序:
你是否曾经想过CD播放器上的“随机”按钮如何工作?它会随机播放CD上的每首歌曲,而不重复播放同一首歌曲。这是确保游戏玩家在看到相同元素之前先看到最广泛的对象、效果或角色等各种功能的非常有用的解决方案。
在描述完这一点后,它继续讨论了C++的实现方法。我试着在Java中实现它,但没有成功地复制它。它也简单描述了它的工作原理,但我也不明白。
我发现了一个类似问题的StackOverflow答案,但不幸的是,答案中的示例链接已经失效了,我也不理解Wikipedia文章,虽然它关于它的描述似乎描述了我正在寻找的内容。
明确一下,我不是在寻找一种重新排列集合的随机方法。我正在寻找一种从集合中随机选择一个元素,只选取一次后再重新开始的方法。
有人能解释一下它的工作原理并在Java中提供一个示例吗?谢谢!
[编辑] 我想把实现的摘录放在这里,以帮助解释我在说什么。以下是其工作原理。通过选择三个大于零的随机值计算跳过值。这些值成为二次方程的系数,域值(x)设置为集合的序数值:
Skip = RandomA * (members * members) + (RandomB * members) + RandomC
使用这个跳过值,您可以使用以下代码遍历整个集合,恰好一次以伪随机顺序:
nextMember += skip;
nextMember %= prime;
skip的值比你的集合成员数量大得多,所以选择的值似乎会随机跳过。当然,此代码位于while循环中,以捕捉选择的值大于你的集合但仍小于质数的情况。
nextMember += skip; nextMember %= prime;
与nextMember = (nextMember + skip % prime) % prime;
是相同的,换句话说,只是使用步长为skip % prime进行简单的步进。唯一让它看起来“随机”的是如果素数的大小显著大于数组的大小。这是非常糟糕的“随机”遍历方式。 - Nuoji