我需要能够生成一个随机数,然后使用该数字在布尔值上动态地种植理论上无限大的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)之间的值。其次,我使用的语言没有种子功能。
我敢肯定有一种琐碎的方式可以做到这一点,我没有看到,或者在他的分形领域有什么可能对我有帮助。有谁知道怎么做?
答案 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的种子,并得出结果。