如何证明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

上一篇: How to prove Mersenne Twister c#

下一篇: random number from four integers