我试图通过使用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
随机量随机增加和减少。这里似乎有什么问题?
答案 0 :(得分:2)
某些版本的rand
(看着你的微软)返回的前几个随机数与它们开始时的种子高度相关,这仅仅是由于使用了随机数生成器公式。由于时间在运行之间不会发生很大变化,因此随机数也不会发生变化。如果你丢弃返回的前几个随机数,你可以得到更好的结果。
更好的解决方案是使用std::uniform_int_distribution
代替rand
。
答案 1 :(得分:-1)
另一个潜在的问题是rand的某些实现可能与某些模块的交互性很差。出于这个原因,你可能想要考虑这样的事情:
int v = ((double)rand() / (double)RAND_MAX) * 100 + 1;
仍然不理想,但很容易。