不断生成0到1之间的随机数

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");
}

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


1
随机数生成器的值不断增加,而且并不真正随机。- 不行! - Mitch Wheat
2
如果程序每次重新运行都发生这种情况,这里有一个解释。 - Alexandru Barbarosie
4
请查看标准库的uniform_real_distribution - juanchopanza
1
更好的衡量标准是什么? - 4pie0
2
“better” 指相对于“真正”的随机生成器的属性,在(统计)测试中表现更好,例如请参见此处:http://en.wikipedia.org/wiki/Pseudorandom_number_generator。 - codeling
显示剩余4条评论
3个回答

8

需要一些指导...

指导1:

正确比较应该使用

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

因为目前在这一行 if(probability <= (1/10)) 中,由于将 1/101/32/3 转换为整数,所以与 0 进行比较。 指南2: 毕竟,您可以使用具有更好统计特性的生成器。
#include <random>
#include <iostream>

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0, 1);
    double uniformOn01 = dis(gen);

随机数生成器不是问题所在。问题在于将介于0和1之间的概率值与像 1/3 这样的分数进行比较;这些分数的值始终为0。 - Pete Becker
1
我认为你应该使用 rand()/((double)RAND_MAX + 1) 来避免整数溢出问题。 - tidy

1
if(probability <= (1/3))
    {
    stockPrice = stockPrice -1;
    }
else
    {
    stockPrice = stockPrice +1;
    }

由于概率永远不会为负数,此代码几乎总是增加stockPrice的值。唯一不增加的情况是probability为0。这是因为1/3整数除法,其值为0。将所有这些分数更改为类似1.0/3的内容,效果将会更好。这与随机数生成器的质量无关。有些人看到rand时非常激动,以至于他们什么也看不到。
然而,代码中的缩放存在一个缺陷,而不是...
double probability = (rand()/(double)RAND_MAX);

使用
double probability = (rand()/(double)(RAND_MAX + 1));

原本的代码中,当 rand() 产生值为 RAND_MAX 时,probability 的值将为1,而其它值则会更加频繁地出现。


0
在所有比较概率的情况中,您都使用了整数除法,结果都为0...而不是(2/3),您需要使用(2/(double)3)2/3.0。这样才能得到正确的结果。

2
虽然这是正确的,但它并没有回答所提出的问题。xD - Jorge Leitao
1
@J.C.Leitão - 是的,它回答了这个问题。代码编写方式几乎总是会增加股票价格。 - Pete Becker
@PeteBecker 我觉得这个问题与随机数本身的值有关,而不是股票价格。 - Jorge Leitao
1
@J.C.Leitão - 尽管反对“rand”的人很吵闹,但地球上没有任何实现能够做到问题所描述的。代码本身就是错误的,它会稳步增加股票价格。如果在修复了这个问题之后仍然存在问题,那么可能需要查看生成器的质量。然而,对于这样一个简单的程序,“rand”已经足够好了,任何问题都在代码本身。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接