我一直在阅读《 游戏编码完成》(第4版) ,但在理解第3章“有用的东西的袋子”一节中的“一组伪随机遍历”路径时遇到一些问题。
您是否想过CD播放器上的“随机”按钮如何工作?它会随机播放CD上的每首歌曲,而不会播放同一首歌曲两次。这是一个非常有用的解决方案,可确保游戏中的玩家在有机会再次看到相同功能之前,先看到最广泛的功能,例如对象,效果或角色。
在描述之后,将继续讨论我尝试用Java实现的C ++实现,但是无法成功复制。它还简要描述了它是如何工作的,但我也不明白。
需要明确的是,我 不是 在寻找一种随机重新排序集合的方法。我正在寻找一种在重复之前从集合中随机选择一个元素的方法。
有人可以解释这种行为如何工作并提供Java示例吗?谢谢!
[ 编辑 ]我认为在这里摘录一个实现可能会有用,以帮助解释我在说什么。
运作方式如下。跳过值是通过选择三个大于零的随机值来计算的。这些值成为二次方的系数,并且域值(x)设置为集合的序数值:
Skip = RandomA * (members * members) + (RandomB * members) + RandomC
有了此跳过值,您可以使用以下代码以伪随机顺序将整个集合精确遍历一次:
nextMember += skip;
nextMember %= prime;
skip的值比集合中成员的数量大得多,以至于所选的值似乎随机地跳来跳去。当然,此代码在while循环内,以捕获所选值大于您的设置但仍小于质数的情况。
这是获得一组字符的随机排列的情况下的示例:
public static void main(String[] args) {
// Setup
char[] chars = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
int prime = 11; // MUST be greater than the length of the set
int skip = 0;
int nextMember = 0;
// If the skip value is divisible by the prime number, we will only access
// index 0, and this is not what we want.
while (skip % prime == 0) {
// Generate three random positive, non-zero numbers
int ra = new Random().nextInt(prime) + 1;
int rb = new Random().nextInt(prime) + 1;
int rc = new Random().nextInt(prime) + 1;
skip = ra * chars.length * chars.length + rb * chars.length + rc;
}
String result = "";
for (int x = 0; x < chars.length; x++) {
do {
nextMember += skip;
nextMember %= prime;
} while (nextMember <= 0 && nextMember > chars.length);
result += chars[nextMember - 1];
}
// Print result
System.out.println(result);
}
本书示例的大多数条件都存在于上面的代码示例中,但有少数例外。首先,如果跳过可以被质数整除,则此算法将不起作用,因为由于这部分代码,它仅会访问索引0:
nextMember += skip;
nextMember %= prime;
其次,这三个系数都在1和素数之间(包括1和2),但不是必须这样。它可以是任何一个非零的正数,但是我发现如果这样做,我将出现整数溢出并得到一个负的跳跃值,这是行不通的。这种特殊情况可以通过采用跳过值的绝对值来解决。
最后,您需要检查下一个成员是否在1到集合的长度(包括端值)之间(包括1和2),然后使该成员的索引比其小1。如果您不这样做(如果您仅检查数字是否小于集合的长度),那么每次运行程序,这很有趣,但是对于随机遍历是不希望的。
程序将选择一个不同的索引,直到访问了所有索引,然后重复执行。当它重复时,将产生相同的排列(这应该是这样工作的),因此,如果我们想要不同的排列,则需要计算一个新的跳过值。该程序的工作归因于二次方程和素数的性质。在不怀疑我在说什么的情况下,我无法详细解释它,并且本书中已经存在或多或少的类似描述。
我已经在3个和5个字符的集合上运行了该程序的稍微修改的版本。对于这两种情况,每个排列均匀出现,与平均分布预期的平均次数相比,平均绝对差分别为0.0413%和0.000000466726%。两家公司都生产了六千万个样品。没有产生重复字符的排列。
本文向大家介绍PHP的伪随机数与真随机数详解,包括了PHP的伪随机数与真随机数详解的使用技巧和注意事项,需要的朋友参考一下 首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。 伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算
生成随机数 # random_random.py import random for i in range(5): print('%04.3f' % random.random(), end=' ') print() # random_uniform.py import random for i in range(5): print('{:04.3f}'.format(ran
问题内容: 当我发现一些奇怪的东西时,我正在玩一些代码: 对我来说奇怪的是变量i地址的变化。 我的猜测是内核提供了不同的堆栈起始地址来尝试阻止某种破解。真正的原因是什么? 问题答案: 正是由于这个原因,在多个操作系统上使用了地址空间布局随机化。堆栈指针地址的变化很可能是由这种情况引起的- 在最新版本的Linux和/或* BSD上很可能是这种情况。IIRC Windows的最新版本也可以做到这一点。
本文向大家介绍在游戏中的随机过程中经常会加入伪随机的设计。请你阐述(或举例)你理解的伪随机的概念,以及伪随机的设计意义。相关面试题,主要包含被问及在游戏中的随机过程中经常会加入伪随机的设计。请你阐述(或举例)你理解的伪随机的概念,以及伪随机的设计意义。时的应答技巧和注意事项,需要的朋友参考一下 伪随机主要是区别用真随机,真随机是指即便是同种试验,在每次试验,均进行一次随机,是真正的概率意义。伪随机
问题内容: 是否有一种Java集合,我的提取顺序是随机的?例如,我将整数1、2、3放入集合中,当我尝试打印它们时,所有结果都可能是“ 1 2 3”,“ 3 2 1”或“ 1 3 2”? 问题答案: 如果只需要随机序列,可以使用Collections.shuffle
问题内容: 如何生成(伪)随机字母数字字符串,例如:PHP中的“ d79jd8c”? 问题答案: 首先用所有可能的字符组成一个字符串: 您还可以使用range()更快地完成此操作。 然后,在一个循环中,选择一个随机数并将其用作字符串的索引以获取随机字符,然后将其附加到您的字符串中: 是随机字符串的长度。