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