2

我正在尝试实现此答案中定义的随机数生成器。至少据我所知,关于第一行static unsigned long x=123456789, y=362436069, z=521288629;应该如何实现存在一些歧义,因为它显示在函数之外。我假设它打算作为一个类成员并因此实现它:

class rng2{

public:    

    unsigned long x, y, z;
    rng2() : x(123456789), y(362436069), z(521288629) {}

    unsigned long xorshf96(void) {          //period 2^96-1

        //static unsigned long x=123456789, y=362436069, z=521288629;

        unsigned long t;
        x ^= x << 16;          //BUS ERROR, debug mode
        x ^= x >> 5;
        x ^= x << 1;

        t = x;
        x = y;                 //SEG FAULT, release mode
        y = z;
        z = t ^ x ^ y;

        return z;
    }

};

int main () 
{
    rng2 rand2;
    rng2 * prand;

    for(long d =0; d < 10000; d++)
        cout << "\n" << (*prand).xorshf96();
}

出于某种原因,这会在指定位置给我带来错误,具体取决于我编译的模式。但是,如果我注释掉成员变量和构造函数并改用静态变量,一切正常。如果这是正确的代码,我不明白为什么它在链接上显示不同,无论哪种方式,我都不知道为什么会发生错误。

4

4 回答 4

4

您正在使用 *prand,但没有初始化 prand。

于 2011-12-15T08:36:58.620 回答
2

这是因为prand指针从未被分配,而只是被使用。使用static变量时,不会访问任何数据成员,这就是您不会收到总线错误的原因。您应该明确地在您的主函数中为您的指针分配一个有效值。像这样

rng2 * prand = new rng2();
于 2011-12-15T08:36:21.880 回答
2

prand是一个野指针

改变:

int main () 
{
    rng2 rand2;
    rng2 * prand;

    for(long d =0; d < 10000; d++)
        cout << "\n" << (*prand).xorshf96();
}

到:

int main () 
{
    rng2 rand2;
    rng2 * prand = &rand2;

    for(long d =0; d < 10000; d++)
        cout << "\n" << (*prand).xorshf96();
}

或者更好的是:

int main () 
{
    rng2 rand2;

    for(long d =0; d < 10000; d++)
        cout << "\n" << rand2.xorshf96();
}
于 2011-12-15T08:37:18.743 回答
2
rng2 * prand;

你完全确定这是真正的代码吗?考虑到您没有初始化此指针并稍后取消引用它,错误非常明显。

于 2011-12-15T08:38:26.793 回答