首先说明一下,下面所谓的随机是“伪随机”。 rand()函数的作用是产生[0,RAND_MAX]之间的一个整数,先看rand函数的用法:
#include<iostream>
using namespace std;
int main()
{
int i;
cout << rand() << endl;
cout << rand() << endl;
cout << rand() << endl;
cout << RAND_MAX << endl;
return 0;
}
结果为:
41
18467
6334
32767
每次运行上述程序,得到的结果都是一样的。其实随机数是这么产生的,对于一个给定的种子而言,后面的随机数序列都定了(不是真正的随机,是“伪随机”,只是人看起来像是随机数而已),而srand函数就是给定种子的函数,对于上述程序而言,默认的给定种子是1,验证如下:
#include<iostream>
using namespace std;
int main()
{
srand(1);
cout << rand() << endl;
cout << rand() << endl;
cout << rand() << endl;
srand(0);
cout << rand() << endl;
cout << rand() << endl;
cout << rand() << endl;
return 0;
}
结果为:
41
18467
6334
38
7719
21238
欣赏程序:
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
srand(time(NULL));
cout << rand() << endl;
cout << rand() << endl;
cout << rand() << endl;
return 0;
}
结果为:
32473
26952
31764
看看下面程序,结果居然是一样的,想想为什么?
#include<iostream>
#include<ctime>
using namespace std;
int getRandom()
{
srand(time(NULL));
return rand();
}
int main()
{
int i;
for(i = 0; i < 10; i++)
{
cout << getRandom() << endl;
}
return 0;
}
结果都是780(但每次运行的结果都不一致,也就是说不一定是780, 但是,这10个数却是相同的),之所以都是780,是因为,连续10次调用很快,系统时间来不及更换。本人实验过,当把10变成一个较大的数时,所得的结果便不一样了,因为系统时间在走动。
那么,如何让程序以某概率执行某一部分呢?可以参考如下程序:
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
int i;
int odd = 0;
int even = 0;
srand(time(NULL));
for(i = 0; i < 10000; i++)
{
if(1 == rand() % 2)
odd++;
else
even++;
}
cout << odd << endl << even << endl;
return 0;
}
结果为:
4976
5024
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
int i;
int a1 = 0;
int a2 = 0;
int a3 = 0;
int n;
srand(time(NULL));
for(i = 0; i < 10000; i++)
{
n = rand();
if(1 == n % 3)
a1++;
else if(2 == n % 3)
a2++;
else
a3++;
}
cout << a1 << endl << a2 << endl << a3 << endl;
return 0;
}
结果为:
3340
3348
3312
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
int i;
int a1 = 0;
int a2 = 0;
int a3 = 0;
int a4 = 0;
int n;
srand(time(NULL));
for(i = 0; i < 10000; i++)
{
n = rand();
if(1 == n % 4)
a1++;
else if(2 == n % 4)
a2++;
else if(3 == n % 4)
a3++;
else
a4++;
}
cout << a1 << endl << a2 << endl << a3 << endl << a4 << endl;
return 0;
}
结果为:
2522
2502
2500
2476
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
int i;
int a1 = 0;
int a2 = 0;
int a3 = 0;
int a4 = 0;
int a5 = 0;
int n;
srand(time(NULL));
for(i = 0; i < 10000; i++)
{
n = rand();
if(1 == n % 5)
a1++;
else if(2 == n % 5)
a2++;
else if(3 == n % 5)
a3++;
else if(4 == n % 5)
a4++;
else
a5++;
}
cout << a1 << endl << a2 << endl << a3 << endl << a4 << endl << a5 << endl;
return 0;
}
结果:
1922
2034
2043
1997
2004
由此看来,对于某一种子而言,循环调用rand函数产生的随机数还真有一点伪随机性,挺好的。