将随机数转化为确定性白噪声

时间:2009-10-12 19:45:08

标签: math fractals

我需要能够生成一个随机数,然后使用该数字在布尔值上动态地种植理论上无限大的2d平面。我需要一个我可以调用的函数,它具有三个输入(x,y和随机种子)的确定性,并返回一个伪随机结果:

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

如果我使用这个函数用1和0填充10x10数组,理想情况下,如果我在每个单元格中要求随机值,即白噪声,它看起来与/相似。它不一定是完美的 - 它不是用于统计分析。我只需要能够在给定相同随机数的情况下重新创建数组。

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

我敢肯定有一种琐碎的方式可以做到这一点,我没有看到,或者在他的分形领域有什么可能对我有帮助。有谁知道怎么做?

6 个答案:

答案 0 :(得分:2)

我想你想要Perlin noise

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

您可以使用rule 30来生成此内容。

答案 3 :(得分: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;
}

答案 4 :(得分: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执行此操作。

答案 5 :(得分:0)

你无法模拟一个无限大的平面。最终,你会遇到某种随机数生成器,而且生成器可以存储的状态位总是有限制。

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

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

从那里开始,事情非常简单:你将x,y坐标的位组合起来就像生成一个线性地址到任何其他2D数组,然后将结果用作PRNG的种子,并得出结果。