2009-10-12 42 views
2

我需要能够生成一个随机数,然后使用该数字来使用布尔值随机播种理论上无限大的2d平面。我需要一个功能,我可以称之为是确定的有三个输入(X,Y,和随机种子),并返回一个伪随机结果返回:将随机数转化为确定性白噪声

int r = random() 
//... 
var value_for_point = f(x,y,r); 

如果我要使用此功能,以填补一个10×10数组与1和零,理想情况下看起来相同/相似,如果我一直要求为每个单元随机选择一个值,即白噪声。它不一定非常完美 - 它不适用于统计分析。我只需要能够在给定相同的随机数的情况下重新创建数组。

我不能简单地种子的随机数发生器有两个原因。首先,我需要这个函数基于x和y。我可以调用这个函数来填充(0,0)和(10,10)之间的数组,然后再询问(-10,-5)和(3,4)之间的值。其次,我正在使用的语言没有种子功能。

我确定有一个微不足道的方法来做到这一点,我没有看到或有分形的域可以帮助我。有人知道怎么做吗?

+0

这是什么语言,为什么它不允许种子发生器? – job 2009-10-12 19:59:44

+0

Javascript。不知道为什么它不允许种子,它只是不。 – 2009-10-12 20:01:57

回答

2

我想你想要Perlin noise

+0

这是有趣的。我还检查了几年后他开发的Simplex算法。谢谢! – 2009-10-12 20:02:53

+0

另一个我觉得非常有用的来源:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm – swegi 2009-10-12 20:26:04

+0

谢谢,我会检查出来。现在,我很快转换了这个simplex实现,并且我似乎获得了可用的结果:http://staffwww.itn.liu.se/~stegu/aqsis/aqsis-newnoise/ – 2009-10-12 20:36:21

0

如果我们知道语言,可能会有帮助。

C#...

static bool GetPixel(int seed, ushort x, ushort y) 
{ 
    int randomSeed = (x << 16 | y)^seed; 
    Random rnd = new Random(randomSeed); 
    /* if you just want a constant result you can seed the function 
     on app start and never touch the random generator again */ 
    return rnd.NextDouble() >= .5; 
} 
+0

我正在使用javasript。它不幸没有种子功能。 – 2009-10-12 20:00:09

+0

那么,如果你没有任何状态,你不能播种功能,你需要的结果是一致的...听起来像你需要硬编码一个常数。 – 2009-10-12 20:04:41

0

只要使用一些简单的像

private static uint GetUint() 
{ 
    m_z = 36969 * (m_z & 65535) + (m_z >> 16); 
    m_w = 18000 * (m_w & 65535) + (m_w >> 16); 
    return (m_z << 16) + m_w; 
} 

和种子的初始值m_z和M_W。为每个x和y做这件事。

1

这不是100%完美的,但是如何使用像SHA1或MD5这样的固定算法? SHA1从任何字符串中输出一个160位的字符串,它或多或少是随机的。要填充你的10x10布尔数组,你只需要最不重要的100位,它应该非常接近随机。因为你以一个已知的基础字符串(任何长度)作为你的种子开始,你的值是可重复的。

我不知道你在用什么语言,但是SHA1和MD5的实现几乎适用于所有的操作系​​统。

+0

这会给我我的10x10数组,但这是一个理论上无限的数组。我需要一个函数,给定三个输入数字,输出一个伪随机结果。 – 2009-10-12 19:59:15

+3

然后将您第一次获得的字符串反馈回SHA1/MD5,并将其用作下一次迭代的种子。它仍然是确定性的,您可以根据需要扩展尽可能多的位数。 – Tenner 2009-10-12 20:02:08

0

您无法模拟无限大的飞机。最终,你会遇到某种随机数字发生器,并且发生器可以存储的状态位数总是有限制的。

也就是说,这个限制大多是理论上的。对于大多数实际用途,您可以根据用户可指定的大小来限制平面大小。例如,如果x和y是两个32位整数,那么您只需要能够模拟一个2^32-1x2^32-1的平面 - 这是一个短于无限的方式。

鉴于你对系统的随机数生成器的说法,您可能需要(或者至少非常想要)编写自己的生成器,或者使用Web上的现有有一段足够长的时间。如果你要使用32位作为X和Y坐标,那么你需要一个至少有64位周期的发生器。

从这里开始,事情很简单:将x,y坐标的位组合起来,就像生成一个线性地址到任何其他二维数组一样,然后将结果作为PRNG的种子,并得出结果。

1

非常简单的数学算法可以产生非常复杂的确定性输出。看看wolfram's book

例如,您可以使用rule 30来生成这个。