Пример #1
0
    static void dsfmt_chk_init_gen_rand(ref dsfmt_t dsfmt, uint32_t seed, int mexp)
    {
        int i;

        if (mexp != dsfmt_mexp)
        {
            Console.WriteLine("DSFMT_MEXP doesn't match with dSFMT.c\n");
            exit(1);
        }

        putpsfmt32(ref dsfmt, idxof(0), seed);
        for (i = 1; i < (((19937 - 128) / 104 + 1) + 1) * 4; i++)
        {
            uint prev = getpsfmt32(ref dsfmt, idxof(i - 1));
            uint tmp  = 1812433253U * (prev ^ (prev >> 30)) + (uint)i;
            if (verbose)
            {
                Console.WriteLine("prev = {0}, loop[{1}] = {2}", prev, i, tmp);
            }
            putpsfmt32(ref dsfmt, idxof(i), tmp);
        }

        initial_mask(ref dsfmt);
        period_certification(ref dsfmt);
        dsfmt.idx = (((19937 - 128) / 104 + 1) * 2);
    }
Пример #2
0
    static void period_certification(ref dsfmt_t dsfmt)
    {
        uint64_t[] pcv = new uint64_t[] { 0x3d84e1ac0dc82880UL, 0x0000000000000001UL };
        uint64_t[] tmp = new uint64_t[2];
        uint64_t   inner;
        int        i;

        tmp[0] = get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2) ^ 0x90014964b32f4329UL;
        tmp[1] = get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1) ^ 0x3b8d12ac548a7c7aUL;
        inner  = tmp[0] & pcv[0];
        inner ^= tmp[1] & pcv[1];
        for (i = 32; i > 0; i >>= 1)
        {
            {
                inner ^= inner >> i;
                if (verbose)
                {
                    Console.WriteLine("inner={0}", inner);
                }
            }
        }

        inner &= 1;
        if (inner == 1)
        {
            return;
        }

        put_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1, get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1) ^ 1UL);
        return;
    }
Пример #3
0
 static void Main()
 {
     Console.WriteLine("Starting");
     dsfmt = new dsfmt_t();
     Kiwi.Pause();
     testGaussian();
     Console.WriteLine("Ending");
 }
Пример #4
0
 static void putpsfmt32(ref dsfmt_t dsfmt, int idx, uint arg)
 {
     if (verbose)
     {
         Console.WriteLine("putpsfmt32 {0} {1:X8}", idx, arg);
     }
     copy(BitConverter.GetBytes(arg), dsfmt.status[idx / 4].array, (idx % 4) * 4);
 }
Пример #5
0
    static void initial_mask(ref dsfmt_t dsfmt)
    {
        int i;

        for (i = 0; i < ((19937 - 128) / 104 + 1) * 2; i++)
        {
            put_ulong(dsfmt.status, i, (get_ulong(dsfmt.status, i) & 0x000FFFFFFFFFFFFFUL) | 0x3FF0000000000000UL);
        }
    }
Пример #6
0
    static uint getpsfmt32(ref dsfmt_t dsfmt, int idx)
    {
        uint tmp = BitConverter.ToUInt32(dsfmt.status[idx / 4].array, (idx % 4) * 4);

        if (verbose)
        {
            Console.WriteLine("getpsfmt32 {0} {1:X8}", idx, tmp);
        }
        return(tmp);
    }
Пример #7
0
    static uint getpsfmt32(ref dsfmt_t dsfmt, int idx)
    {
        ulong tmp2 = dsfmt.status[idx / 4].pair[(idx / 2) % 2];
        uint  tmp  = ((idx & 1) == 1) ? (uint)(tmp2 >> 32) : (uint)(tmp2 & 0xFFFFFFFF);

        if (verbose)
        {
            Console.WriteLine("getpsfmt32 {0} {1:X8}", idx, tmp);
        }
        return(tmp);
    }
Пример #8
0
 static void dsfmt_fill_array_open_open(ref dsfmt_t dsfmt, double[] array, int size)
 {
     w128_t [] warray = new w128_t [size / 2];
     for (int i = 0; i < warray.Length; i++)
     {
         warray[i] = new w128_t();
     }
     gen_rand_array_o0o1(ref dsfmt, ref warray, size / 2);
     for (int i = 0; i < size; i++)
     {
         array [i] = get_double(warray, i);
     }
 }
Пример #9
0
    static void gen_rand_array_o0o1(ref dsfmt_t dsfmt, ref w128_t[] array, int size)
    {
        int i;
        int j;

        w128_t[] lung = new w128_t[1];
        lung [0] = new w128_t();
        if (verbose)
        {
            Console.WriteLine("gen_rand_array_o0o1");
        }
        put_ulong(lung, 0, get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2));
        put_ulong(lung, 1, get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1));
        do_recursion(ref array, 0, ref dsfmt.status, 0, ref dsfmt.status, 117, ref lung);
        for (i = 1; i < ((19937 - 128) / 104 + 1) - 117; i++)
        {
            do_recursion(ref array, i, ref dsfmt.status, i, ref dsfmt.status, i + 117, ref lung);
        }

        for ( ; i < ((19937 - 128) / 104 + 1); i++)
        {
            do_recursion(ref array, i, ref dsfmt.status, i, ref array, i + 117 - ((19937 - 128) / 104 + 1), ref lung);
        }

        for ( ; i < size - ((19937 - 128) / 104 + 1); i++)
        {
            do_recursion(ref array, i, ref array, i - ((19937 - 128) / 104 + 1), ref array, i + 117 - ((19937 - 128) / 104 + 1), ref lung);
            convert_o0o1(ref array, (i - ((19937 - 128) / 104 + 1)));
        }

        for (j = 0; j < 2 * ((19937 - 128) / 104 + 1) - size; j++)
        {
            put_ulong(dsfmt.status, j * 2, get_ulong(array, (j + size - ((19937 - 128) / 104 + 1)) * 2));
            put_ulong(dsfmt.status, j * 2 + 1, get_ulong(array, (j + size - ((19937 - 128) / 104 + 1)) * 2 + 1));
        }

        for ( ; i < size; i++, j++)
        {
            do_recursion(ref array, i, ref array, i - ((19937 - 128) / 104 + 1), ref array, i + 117 - ((19937 - 128) / 104 + 1), ref lung);
            put_ulong(dsfmt.status, j * 2, get_ulong(array, i * 2));
            put_ulong(dsfmt.status, j * 2 + 1, get_ulong(array, i * 2 + 1));
            convert_o0o1(ref array, (i - ((19937 - 128) / 104 + 1)));
        }

        for (i = size - ((19937 - 128) / 104 + 1); i < size; i++)
        {
            convert_o0o1(ref array, i);
        }
        put_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2, get_ulong(lung, 0));
        put_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1, get_ulong(lung, 1));
    }
Пример #10
0
 static void putpsfmt32(ref dsfmt_t dsfmt, int idx, uint arg)
 {
     if (verbose)
     {
         Console.WriteLine("putpsfmt32 {0} {1:X8}", idx, arg);
     }
     if ((idx & 1) == 1)
     {
         dsfmt.status[idx / 4].pair[(idx / 2) % 2] = (dsfmt.status[idx / 4].pair[(idx / 2) % 2] & 0xFFFFFFFFUL) | (((ulong)arg) << 32);
     }
     else
     {
         dsfmt.status[idx / 4].pair[(idx / 2) % 2] = (dsfmt.status[idx / 4].pair[(idx / 2) % 2] & 0xFFFFFFFF00000000UL) | arg;
     }
 }
Пример #11
0
 static void dsfmt_init_gen_rand(ref dsfmt_t dsfmt, uint32_t seed)
 {
     dsfmt_chk_init_gen_rand(ref dsfmt, seed, 19937);
 }
Пример #12
0
 static void Main()
 {
     dsfmt = new dsfmt_t();
     testGaussian();
 }