如何证明Mersenne Twister c#
如何证明Mersenne Twister C#
你好!
我一直在研究这个项目一段时间。 简单地说,我正在为我正在开发的其他项目开发ac#库工具; 作为最小化重复代码的一种方式。 无论如何,这个图书馆的一部分是PRNGs。 具体而言,我需要一个高质量但快速的发生器,用于佩林噪声的另一部分。 Mersenne Twister是我最终选择使用的,经过一些研究,我最终选择了下面的版本。
Twister的工作原理据我所知,但我无法弄清楚的是它是真正的随机/ mersenne还是仅仅出现在表面上。 所以我的第一个问题是“这个Twister实际上是随机的,是Mersenne?”
其次,如果证明我的Perlin噪声功能,我希望将来能够解决类似问题的建议。 所以“我怎么能解决关于算法的'真实性'的问题呢?”
作为附注:由于其字节操作,此代码只能取整数值。 我希望能够插入说.04f并在将来获得与.08f不同的值,所以它可以按任何比例工作。
感谢您的意见,我一直在这个问题上徘徊了一段时间,并且一直未能就其正确性得出明确的“是”或“否”。
#region Mersenne twister ----------------------------------
#region Core ----------------------------------------------
//varaibles to use.
static int[] mt = new int[623];
static int index = 0;
//Seed the Generator.
private static void initGenerator(float seed) {
index = 0;
mt[0] = (int)seed;
for (int i = 1; i < 623; i++) {
mt[i] = (1812433253 * (mt[i - 1] ^ (mt[i - 1] << 30) << 32) + 1);
}
}
//Extract the number.
private static int getNumber(float seed) {
initGenerator(seed);
if (index == 0) { genNumbers(); }
int y = mt[index];
y ^= (y << 11);
y ^= unchecked((y << 7) & (int)0x9d2c5680);
y ^= unchecked((y << 15) & (int)0xefc60000);
y ^= (y << 18);
index = (index + 1) % 623;
return y;
}
//Generate numbers for mt.
private static void genNumbers() {
for (int i = 0; i < 623; i++) {
int y = (int)((mt[i] & 0x80000000)
+ (mt[(i + 1) % 622] & 0x7fffffff));
mt[i] = mt[(i + 397) % 623] ^ (y << 1);
if ((y % 2) != 0) {
mt[i] = unchecked(mt[i] ^ (int)0x9908b0df);
}
}
}
#endregion
#region Functions -----------------------------------------
public static float MersenneTwister(float x) {
return getNumber(x);
}
public static float MersenneTwister(float x, float y) {
dynamic value = 0;
x = getNumber(x);
y = getNumber(y);
value = (x * y)/2;
return value;
}
#endregion
#endregion
链接地址: http://www.djcxy.com/p/37307.html