1

有人可以建议一种获取全局种子值的好方法,例如“Hello World”并使用该值在数组或表中查找值。

我有点像经典的“精英”太空飞行游戏,其中行星有不同的属性,但它们不是随机的,只是从宇宙的种子值中推导出来的。

我在考虑输入值的 MD5,然后使用哈希中的字节,将它们转换为整数并将它们修改为查找表的可接受索引,但我怀疑必须有更好的方法?我读过一些关于梅森龙卷风的东西,但也许那是矫枉过正。

我希望能对我的查找表中的值产生良好的分布。例如红色、橙色、黄色、绿色、蓝色、紫色

另外要强调的是,我每次都不是在寻找随机值,而是在寻找一致的值。

更新:也许我很难表达我自己的问题域。这是一个使用生成器并且可以生成 X 个值的站点的示例:http ://www.seventhsanctum.com

附加标准

我更愿意从第一原则开始工作,而不是使用诸如 System.Random 之类的库函数

4

2 回答 2

2

我的方法是使用您的密钥作为随机数生成器的种子

public StarSystem(long systemSeed){
    java.util.Random r = new Random(systemSeed);
    Color c = colorArray[r.nextInt(colorArray.length)]; // generates a psudo-random-number based from your seed
    PoliticalSystem politics = politicsArray[r.nextInt(politicsArray.length)];
    ...
}

对于给定的种子,每次都会产生相同的颜色和相同的政治制度。

要从字符串中获取起始种子,您可以使用 MD5Sum 并获取第一个/最后一个 64 位作为您的 long,另一种方法是只为每个植物使用一个数字。Elite 还使用其伪随机生成器为每个系统生成名称。

for(long seed=1; seed<NUMBER_OF_SYSTEMS; seed++){
    starSystems.add(new StarSystem(seed));
}

通过将种子设置为已知值,每次调用 Random 时都会返回相同的序列,这就是为什么在尝试获得好的随机值时,好的种子非常重要。但是,在您的情况下,已知种子会产生您正在寻找的结果。

c# 等价物是

public StarSystem(int systemSeed){
    System.Random r = new Random(systemSeed);
    Color c = colorArray[r.next(colorArray.length)]; // generates a psudo-random-number based from your seed
    PoliticalSystem politics = politicsArray[r.next(politicsArray.length)];
    ...
} 

注意到区别了吗?不,我也没有。

于 2010-01-24T13:52:02.167 回答
1

许多常见的随机数生成器会在给定相同种子值的情况下生成相同的序列,因此您所需要做的似乎就是将您的名字转换为数字。有许多散列函数可以做到这一点。

补充问题:是否要求所有唯一的字符串都生成唯一的哈希,因此(可能)唯一的伪随机序列。?

于 2010-01-24T14:07:23.983 回答