将随机数转化为确定性白噪声
我需要能够生成一个随机数,然后使用该数字来使用布尔值随机播种理论上无限大的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)之间的值。其次,我正在使用的语言没有种子功能。
我确定有一个微不足道的方法来做到这一点,我没有看到或有分形的域可以帮助我。有人知道怎么做吗?
我想你想要Perlin noise?
这是有趣的。我还检查了几年后他开发的Simplex算法。谢谢! – 2009-10-12 20:02:53
另一个我觉得非常有用的来源:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm – swegi 2009-10-12 20:26:04
谢谢,我会检查出来。现在,我很快转换了这个simplex实现,并且我似乎获得了可用的结果:http://staffwww.itn.liu.se/~stegu/aqsis/aqsis-newnoise/ – 2009-10-12 20:36:21
如果我们知道语言,可能会有帮助。
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;
}
我正在使用javasript。它不幸没有种子功能。 – 2009-10-12 20:00:09
那么,如果你没有任何状态,你不能播种功能,你需要的结果是一致的...听起来像你需要硬编码一个常数。 – 2009-10-12 20:04:41
只要使用一些简单的像
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做这件事。
这不是100%完美的,但是如何使用像SHA1或MD5这样的固定算法? SHA1从任何字符串中输出一个160位的字符串,它或多或少是随机的。要填充你的10x10布尔数组,你只需要最不重要的100位,它应该非常接近随机。因为你以一个已知的基础字符串(任何长度)作为你的种子开始,你的值是可重复的。
我不知道你在用什么语言,但是SHA1和MD5的实现几乎适用于所有的操作系统。
这会给我我的10x10数组,但这是一个理论上无限的数组。我需要一个函数,给定三个输入数字,输出一个伪随机结果。 – 2009-10-12 19:59:15
然后将您第一次获得的字符串反馈回SHA1/MD5,并将其用作下一次迭代的种子。它仍然是确定性的,您可以根据需要扩展尽可能多的位数。 – Tenner 2009-10-12 20:02:08
您无法模拟无限大的飞机。最终,你会遇到某种随机数字发生器,并且发生器可以存储的状态位数总是有限制的。
也就是说,这个限制大多是理论上的。对于大多数实际用途,您可以根据用户可指定的大小来限制平面大小。例如,如果x和y是两个32位整数,那么您只需要能够模拟一个2^32-1x2^32-1的平面 - 这是一个短于无限的方式。
鉴于你对系统的随机数生成器的说法,您可能需要(或者至少非常想要)编写自己的生成器,或者使用Web上的现有有一段足够长的时间。如果你要使用32位作为X和Y坐标,那么你需要一个至少有64位周期的发生器。
从这里开始,事情很简单:将x,y坐标的位组合起来,就像生成一个线性地址到任何其他二维数组一样,然后将结果作为PRNG的种子,并得出结果。
这是什么语言,为什么它不允许种子发生器? – job 2009-10-12 19:59:44
Javascript。不知道为什么它不允许种子,它只是不。 – 2009-10-12 20:01:57