补充与携带相乘(CMWC)RNG C winmain @ 16编译问题

时间:2012-10-14 16:46:49

标签: c random compilation

http://en.wikipedia.org/wiki/Multiply-with-carry#Complementary-multiply-with-carry_RNGs 在C

中有一些代码

我正在尝试编译它,但是当我这样做时,我得到了这个错误 c:\ program files(x86)\ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.4.1 ...... \ libmingw32.a(main.o):main.c ||未定义的引用`WinMain @ 16'|

这是代码

我希望弄清楚如何实施它并使用它而不是助推器的mersenne twister。

有人指出,我错过了我的主要功能,但现在有了它,我仍然遇到问题让它运行。

#include <stdint.h>

#define PHI 0x9e3779b9

static uint32_t Q[4096], c = 362436;



int main
{
    init_rand(6);

    int c = rand_cmwc();
};

void init_rand(uint32_t x)
{
        int i;

        Q[0] = x;
        Q[1] = x + PHI;
        Q[2] = x + PHI + PHI;

        for (i = 3; i < 4096; i++)
                Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i;
}

uint32_t rand_cmwc(void)
{
        uint64_t t, a = 18782LL;
        static uint32_t i = 4095;
        uint32_t x, r = 0xfffffffe;
        i = (i + 1) & 4095;
        t = a * Q[i] + c;
        c = (t >> 32);
        x = t + c;
        if (x < c) {
                x++;
                c++;
        }
        return (Q[i] = r - x);
}

1 个答案:

答案 0 :(得分:3)

好的,我明白了。

我错过了我的主要功能。

然后我将代码实现为类,希望使其成为线程安全(允许多个种子)

#include <iostream>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#define PHI 0x9e3779b9

using namespace std;

static uint32_t Q[4096], c = 362436;

class cmwc
{

  public:

    void init_rand(uint32_t x)
    {
        int i;

        Q[0] = x;
        Q[1] = x + PHI;
        Q[2] = x + PHI + PHI;

        for (i = 3; i < 4096; i++)
                Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i;
    }

    uint32_t rand_cmwc(void)
    {
        uint64_t t, a = 18782LL;
        static uint32_t i = 4095;
        uint32_t x, r = 0xfffffffe;
        i = (i + 1) & 4095;
        t = a * Q[i] + c;
        c = (t >> 32);
        x = t + c;
        if (x < c) {
                x++;
                c++;
        }
        return (Q[i] = r - x);
    }

    uint32_t random_num;

};

int main()
{
    cmwc rng1;

    rng1.init_rand(time(NULL));

    rng1.random_num = 1 + rng1.rand_cmwc()%6;

    //int r = rng1.rand_cmwc();

    cout << "die: " << rng1.random_num << endl;


    return 0;
}