为什么我的随机'每次运行程序时生成的数字都在增加?

时间:2016-09-16 22:18:47

标签: c++ random

我试图通过使用srand()rand()来获取随机生成的数字,但没有使用avale:每次运行程序时,它都会增加一定数量的数字。但如果我使用for语句,则无法看到任何模式。

例如,如果我使用下面提供的代码并运行并关闭程序10次,则输出将为:

42
52
72
78
85
92
12 (it has reset)
32
48  

注意:我注意到一件奇怪的事情,当我关注或最小化Visual Studio并关闭命令提示符时,下次运行程序时,数字会增加20以上但是,如果我没有聚焦或最小化Visual Studio,那么这个数字会略微超过1-5。为什么?

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    srand (time(NULL));

    int random_number = rand () % 100 + 1;
    cout << "Random number: " << random_number << endl;

    return 0;
}

但是,如果我使用这段代码:

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    srand (time(NULL));

    for (int i = 0; i < 10; i++) {
        int random_number = rand () % 100 + 1;
        cout << "Random number: " << random_number << endl;
    }

    return  0;
}

这些数字没有明确的模式,我得到了输出:

31
10
81
66
74
14
6
97
39
23 

随机量随机增加和减少。这里似乎有什么问题?

2 个答案:

答案 0 :(得分:2)

某些版本的rand(看着你的微软)返回的前几个随机数与它们开始时的种子高度相关,这仅仅是由于使用了随机数生成器公式。由于时间在运行之间不会发生很大变化,因此随机数也不会发生变化。如果你丢弃返回的前几个随机数,你可以得到更好的结果。

更好的解决方案是使用std::uniform_int_distribution代替rand

答案 1 :(得分:-1)

另一个潜在的问题是rand的某些实现可能与某些模块的交互性很差。出于这个原因,你可能想要考虑这样的事情:

 int v = ((double)rand() / (double)RAND_MAX) * 100 + 1;

仍然不理想,但很容易。