【问题标题】:How to set seed value in equivalent of srand48 function?如何设置与 srand48 函数等效的种子值?
【发布时间】:2013-07-23 08:35:56
【问题描述】:

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

【问题讨论】:

标签: c++ c random


【解决方案1】:

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

C++11 §5/4

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

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

m = 281474976710656LL;

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

mfml_win_drandX0 = a * mfml_win_drandX0 + c;

您在哪里进行从const doublelong 的转换。

【讨论】:

  • @lulyon:伪随机数引擎是确定性的(因此它们不包含真正的随机性)但很难预测下一个数字(即:数字是随机的),特别是如果你不'不知道算法和种子值:)
  • 对他的回答发表评论可能会有所帮助 - 而不是你自己
  • 很遗憾,由于我的代表率低,我还不能评论他/她的回答。
【解决方案2】:

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

【讨论】:

  • 它是一个线性随机数生成器,它基于这个方程工作。你从一些值开始,然后计算所谓的伪随机值。
  • @Misery Good。这就解释了一切。
猜你喜欢
  • 2014-06-24
  • 2022-01-08
  • 2021-03-23
  • 2011-03-25
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
相关资源
最近更新 更多