您的位置:首页 > 编程语言 > C语言/C++

c++产生随机数

2008-12-02 20:51 218 查看
C++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的结果作为种子。但如果分两次执行程序,那么由于种子相同,生成的“随机数”也是相同的。

在工程应用时,我们一般将系统当前时间(Unix时间)作为种子,这样生成的随机数更接近于实际意义上的随机数。给一下例程如下:

#include <iostream>

#include <ctime>

#include <cstdlib>

using namespace std;

int main()

{

double random(double,double);

srand(unsigned(time(0)));

for(int icnt = 0; icnt != 10; ++icnt)

cout << "No." << icnt+1 << ": " << int(random(0,10))<< endl;

return 0;

}

double random(double start, double end)

{

return start+(end-start)*rand()/(RAND_MAX + 1.0);

}

/* 运行结果

* No.1: 3

* No.2: 9

* No.3: 0

* No.4: 9

* No.5: 5

* No.6: 6

* No.7: 9

* No.8: 2

* No.9: 9

* No.10: 6

*/

利用这种方法能不能得到完全意义上的随机数呢?似乎9有点多哦?却没有1,4,7?!我们来做一个概率实验,生成1000万个随机数,看0-9这10个数出现的频率是不是大致相同的。程序如下:

#include <iostream>

#include <ctime>

#include <cstdlib>

#include <iomanip>

using namespace std;

int main()

{

double random(double,double);

int a[10] = {0};

const int Gen_max = 10000000;

srand(unsigned(time(0)));

for(int icnt = 0; icnt != Gen_max; ++icnt)

switch(int(random(0,10)))

{

case 0: a[0]++; break;

case 1: a[1]++; break;

case 2: a[2]++; break;

case 3: a[3]++; break;

case 4: a[4]++; break;

case 5: a[5]++; break;

case 6: a[6]++; break;

case 7: a[7]++; break;

case 8: a[8]++; break;

case 9: a[9]++; break;

default: cerr << "Error!" << endl; exit(-1);

}

for(int icnt = 0; icnt != 10; ++icnt)

cout << icnt << ": " << setw(6) << setiosflags(ios::fixed) << setprecision(2) << double(a[icnt])/Gen_max*100 << "%" << endl;

return 0;

}

double random(double start, double end)

{

return start+(end-start)*rand()/(RAND_MAX + 1.0);

}

/* 运行结果

* 0: 10.01%

* 1: 9.99%

* 2: 9.99%

* 3: 9.99%

* 4: 9.98%

* 5: 10.01%

* 6: 10.02%

* 7: 10.01%

* 8: 10.01%

* 9: 9.99%

*/

可知用这种方法得到的随机数是满足统计规律的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: