查找表的伪随机种子方法

时间:2010-01-24 13:36:17

标签: hash random seeding

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

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

我在考虑MD5输入值,然后使用哈希中的字节,将它们转换为整数并将它们修改为可接受的查找表索引,但我怀疑必须有更好的方法吗?我读了一些关于梅森捻线的事情,但也许这样就太过分了。

我希望能够对查询表中的值进行良好的分配。例如红色,橙色,黄色,绿色,蓝色,紫色

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

更新:也许我在表达自己的问题域时遇到了困难。以下是使用生成器并可生成X个值的站点示例:http://www.seventhsanctum.com

其他条件

我更愿意从第一原则开始,而不是使用System.Random等库函数

2 个答案:

答案 0 :(得分: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位,另一种方法是仅为每个植物使用数字。 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)];
    ...
} 

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

答案 1 :(得分:1)

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

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