我试图用C ++模拟股票价格变动。我需要创建一个介于0到1之间的随机数。
但似乎随机数生成器值不断增加,并不是真正随机的。
代码如下所示:
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<time.h>
using namespace std;
int main()
{
double stockPrice = 25;
int start = 0, end = 0;
start = clock();
srand (time(NULL));
cout << (double) rand() / (double) (RAND_MAX) << endl;
system("pause");
while(stockPrice > 18)
{
if(stockPrice == 20)
{
double probability = (rand()/(double)RAND_MAX);
if(probability <= (1/10))
{
stockPrice = stockPrice-1;
}
else
{
stockPrice = stockPrice +1;
}
}
else if (stockPrice < 20)
{
double probability = (rand()/(double)RAND_MAX);
if(probability <= (1/3))
{
stockPrice = stockPrice -1;
}
else
{
stockPrice = stockPrice +1;
}
}
else
{
double probability = (rand()/(double)RAND_MAX);
if(probability <= (2/3))
{
stockPrice = stockPrice -1;
}
else
{
stockPrice = stockPrice +1;
}
}
cout << stockPrice << endl;
}
end = clock();
double t = (double)(start-end)/CLOCKS_PER_SEC;
cout << t << endl;
system("pause");
}
不知道如何解决这个问题。需要一些指导...
答案 0 :(得分:8)
需要一些指导......
指南1:
正确的比较,你应该使用
double probability = (rand()/(double)(RAND_MAX + 1));
^
for better scaling
因为当前排在if(probability <= (1/10))
行,因为转换1/10
1/3
和2/3
转换为整数
指南2:
毕竟你可以使用更好的statistical properties
生成器#include <random>
#include <iostream>
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0, 1);
double uniformOn01 = dis(gen);
答案 1 :(得分:1)
if(probability <= (1/3))
{
stockPrice = stockPrice -1;
}
else
{
stockPrice = stockPrice +1;
}
由于probabililty
永远不会消极,因此此代码几乎总是增加stockPrice
的值。唯一一次它赢了“probability
为0时那是因为1/3
是整数除法,它的值为0.更改全部这些分数与1.0/3
类似,事情会好得多。这与随机数生成器的质量有很强的关系 。有些人在看到rand
他们没有看到任何其他内容时会受到如此锻炼。
然而, 是代码中缩放的一个缺陷。而不是
double probability = (rand()/(double)RAND_MAX);
使用
double probability = (rand()/(double)(RAND_MAX + 1));
根据最初的说法,只要probability
生成值rand()
,RAND_MAX
的值就会为1,并且它会更频繁地生成其他值。
答案 2 :(得分:0)
在你比较整数除法的概率的所有情况下,所有这些都导致0 ...而不是(2/3)
你想要(2/(double)3)
或2/3.0
。