0

我需要在 C 中编写 UNIX/LINUX srand48 和 drand48 函数。我坚持设置和使用种子值。我有两个功能:

#include <math.h>

long int mfml_win_drandX0;  //actual value used for generation

void srand48(long int seedval) 
{
    mfml_win_drandX0=seedval;  //setting seed into mfml_win_drandX0
}

double drand48(void)
{
    static const double a=0x273673163155, 
                        c=0x13,
                m=281474976710656;
/*EDIT: error was here*/
    mfml_win_drandX0=fmod(a*mfml_win_drandX0+c,m);;  //computing the next value
    return mfml_win_drandX0/m; 
}

但是使用时:

srand48(2) ;

for (int i=0;i<10;i++)
    std::cout<<drand48()<<std::endl;

我每次都得到相同的数字(mfml_win_drandX0)没有改变。如何解决这个问题?

4

2 回答 2

3

即使您选择 long long 作为其类型,您也不能保证它mfml_win_drandX0会在 a 可表示的范围内。long intAFAIK 这是未定义的行为:

C++11 §5/4

“如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。”</p>

而且我想你应该避免以这种方式定义 m,因为当你输入一个具有整数类型的文字时,它被定义为一个 int。使用

m = 281474976710656LL;

更好,但这并不能解决您的主要问题。另外,请注意

mfml_win_drandX0 = a * mfml_win_drandX0 + c;

在哪里进行从const double到的转换long

于 2013-07-23T09:19:39.137 回答
0

你期望得到什么?您的代码中没有任何随机性。a, c, m 都是常数,你不会得到不同的结果 util 改变 mfml_win_drandX0。

于 2013-07-23T09:11:00.880 回答