yak*_*yak 5 c++ random generator
我写了一个简单的程序(试图实际实现线性同余生成器),但我不太确定它的工作原理应该如何.
我想使用我的生成器从[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;
}
Run Code Online (Sandbox Code Playgroud)
并输出:
0.00025194
0.000252278
0.000252279
0.000252279
0.000252279
0.000252279
Run Code Online (Sandbox Code Playgroud)
然而,切换到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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
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
...
Run Code Online (Sandbox Code Playgroud)
但我需要它来生成随机双数,大于或等于0且小于或等于1 :(
这不是程序,而是数字的选择。
prev一开始等于零,所以第一个数字变成C。
然后,prev等于C,这使得 prev A*C + C。然而,A*C是如此之小,以至于当将它作为浮点添加到前一个浮点时,有效数字会被移出,并且您将保留之前的内容。
您可以阅读每个计算机科学家应该了解的浮点运算的更多内容。
| 归档时间: |
|
| 查看次数: |
4611 次 |
| 最近记录: |