gpt4 book ai didi

c++ - C++ 中的线性同余生成器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:58 25 4
gpt4 key购买 nike

我写了一个简单的程序(试图实际实现线性同余生成器),但我不太确定它能正常工作。

我想使用我的生成器从 [0,1] 生成 250 个数字。但是,似乎我得到的不是随机数,而是相等的值..

如何改进/我做错了什么?

代码如下:

#include <iostream>
#include <cmath>

static const double A = 0.001342;
static const double C = 0.00025194;
static const double RAND_MAX = 1.0;

double rand()
{
static double prev = 0;
prev = A * prev + fmod(C, RAND_MAX);
return prev;
}

int main(int argc, char **argv)
{
for(int i=0; i<6; i++)
std::cout << rand() << "\n";
return 0;
}

输出:

0.00025194
0.000252278
0.000252279
0.000252279
0.000252279
0.000252279

切换到 int 而不是 double,但是会产生一些不错的结果:

#include <iostream>
#include <cmath>

static const int A = 5;
static const int C = 3;
static const int RAND_MAX = 8;

double rand()
{
static int prev = 1;
prev = A * prev + (C % RAND_MAX);
return prev;
}

int main(int argc, char **argv)
{
for(int i=0; i<100; i++)
std::cout << rand() << "\n";
return 0;
}

输出:

8
43
218
1093
5468
27343
136718
683593
3.41797e+06
1.70898e+07
8.54492e+07
4.27246e+08
2.13623e+09
2.09122e+09
1.86615e+09
7.40836e+08
-5.90786e+08
1.34104e+09
...

但我需要它来生成大于或等于 0 且小于或等于 1 的随机双数 :(

最佳答案

这不是程序,而是数字的选择。

prev 开头为零,因此第一个数字变为 C

然后,prev 等于C,这使得 prev A*C + C。但是,A*C 太小了,当将它作为 float 添加到前一个时,有效数字被移出,剩下的就是之前的内容。

您可以在 What Every Computer Scientist Should Know About Floating-Point Arithmetic 上阅读更多内容.

关于c++ - C++ 中的线性同余生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com