创建一个0到1之间连续的随机数

时间:2013-09-30 10:09:11

标签: c++ algorithm math random

我试图用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");
}

不知道如何解决这个问题。需要一些指导...

3 个答案:

答案 0 :(得分:8)

  

需要一些指导......

指南1:

正确的比较,你应该使用

double probability = (rand()/(double)(RAND_MAX + 1));
                                               ^
                                        for better scaling

因为当前排在if(probability <= (1/10))行,因为转换1/10 1/32/3转换为整数

,您将与0进行比较

指南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