如何设置相当于srand48函数的种子值?

时间:2013-07-23 08:35:57

标签: c++ c random

我需要在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)不会改变。如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您无法保证mfml_win_drandX0将在long int所代表的范围内,即使您选择长期类型也是如此。 AFAIK这是未定义的行为:

  

C ++11§5/ 4

     

“如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义。”

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

m = 281474976710656LL;

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

mfml_win_drandX0 = a * mfml_win_drandX0 + c;

您从const double转换为long的位置。

答案 1 :(得分:0)

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