5

我正在尝试用 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");
}

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

4

3 回答 3

8

需要一些指导...

指导1:

正确的比较,你应该使用

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

因为目前if(probability <= (1/10))你正在与 0 进行比较,因为转换1/10 1/32/3整数

指导2:

毕竟你可能会使用具有更好统计特性的生成器

#include <random>
#include <iostream>

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0, 1);
    double uniformOn01 = dis(gen);
于 2013-09-30T10:31:24.690 回答
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));

正如最初所写的,每当产生 value时, 的值probability都会为 1 ,并且它会更频繁地产生其他值。rand()RAND_MAX

于 2013-09-30T14:09:04.620 回答
0

在您比较整数除法的概率的所有情况下,所有结果都导致 0... 而不是(2/3)您想要的(2/(double)3)or 2/3.0

于 2013-09-30T10:20:06.543 回答