C++怎么产生随机数?

如题所述

本文由青松原创并依GPL-V2及其后续版本发放,转载请注明出处且应包含本行声明。

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] = ;
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%
*/
可知用这种方法得到的随机数是满足统计规律的。

另:在Linux下利用GCC编译程序,即使我执行了1000000次运算,是否将random函数定义了inline函数似乎对程序没有任何影响,有理由相信,GCC已经为我们做了优化。但是冥冥之中我又记得要做inline优化得加O3才行...

不行,于是我们把循环次数改为10亿次,用time命令查看执行时间:
chinsung@gentoo ~/workspace/test/Debug $ time ./test
0: 10.00%
1: 10.00%
2: 10.00%
3: 10.00%
4: 10.00%
5: 10.00%
6: 10.00%
7: 10.00%
8: 10.00%
9: 10.00%

real 2m7.768s
user 2m4.405s
sys 0m0.038s
chinsung@gentoo ~/workspace/test/Debug $ time ./test
0: 10.00%
1: 10.00%
2: 10.00%
3: 10.00%
4: 10.00%
5: 10.00%
6: 10.00%
7: 10.00%
8: 10.00%
9: 10.00%

real 2m7.269s
user 2m4.077s
sys 0m0.025s

前一次为进行inline优化的情形,后一次为没有作inline优化的情形,两次结果相差不大,甚至各项指标后者还要好一些,不知是何缘由...
温馨提示:内容为网友见解,仅供参考
无其他回答

C++如何获得一个随机的数?
一、C++获取随机数的方法 rand()方法是C++获取随机数的方法,可以通过srand()方法获取系统的时间,用系统时间作为判断依据,生成随机数,随机数的大小通过rand()方法获取的值,进行取余后获得。也就是说,srand方法获取到了系统的时间,他是毫秒级的,然后通过这个毫秒级的数据,对100取余,即可获得0-1...

C++产生随机数的
要生成随机数,C++程序通常会通过数组和指针来实现。首先,你需要定义一个整数类型的数组,用于存储随机数序列,同时定义一个指向数组首元素的指针。在初始化步骤中,将指针定位到数组的第一个元素,这是随机数生成过程的起点。然后,设置一个循环条件,通常是直到指针达到数组的尾部。在每次循环中,指针向...

C++产生任意两数之间随机数的方法例举
通用公式中,num表示产生随机数的整数范围,i表示随机数的起始值。

C++库的随机数生成
C++中使用random头文件和default_random_engine,这为随机数生成提供了更灵活的途径。default_random_engine是一个可调用对象,可以与rand()类似使用。但其支持多线程,并需在构造时或使用成员函数seed初始化种子,否则每次生成相同随机数。在C++中,除了引擎,还需结合随机数分布对象以适应特定需求。例如,u...

c++如何产生随机数
随机数 可用系统的函数 int rand (void); 产生,随机数数值范围将 在 0 到 RAND_MAX 之间。为使每次产生的随机数更随机,可用当前时间,用 srand() 产生一个随机种子。c++ 程序例子如下:include<iostream> using namespace std;include <stdio.h> include int main(){ int a[10],i;\/\/ ini...

c++如何随机生成0和1
1)C++中的rand()函数可以得到一个0-RNDMAX之间的随机数,Randmax是一个宏,你可以把它理解成65535;2)使用rand()函数必须添加头文件,代码如下:include <cstdlib> 3) 得到0或1的随机数代码如下:int num=rand()%2;因为对2求余的结果不是0就是1,因此上面这句代码就得到了一个0或1的随机...

c++如何产生随机数,并规定取值范围?
用rand()函数产生随机数,想规定范围就用取余,比如限定一个随机数为【3 ,102】的数,那么(rand()%(102-3+1))+3,这样得到数就会在这个范围里,102-3+1==100,那么rand()%100的范围为 0-99,这个范围再加3为3 - 102

C++中怎样生成一组随机数组
1、C语言提供了一些库函数来实现随机数的产生。C语言中有三个通用的随机数发生器,分别为 rand函数, random函数, randomize 函数。rand函数产生的并不是真意正义上的随机数,是一个伪随机数,是根据一个数,称之为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态...

c++如何产生0到1之间的随机数?
C++中用来产生随机数的函数为rand(), 其返回值为整数。而0到1之间的随机数,明显是浮点数。这样无法直接产生。于是,必须经过转换。转换思路为,生成一个0-N的随机数,然后对其除以N+1,则可以得到0-1直接的浮点型随机数。N的确定,可以与要求的精度有关,比如需要三位小数,可以采用N=999,如需要...

C++中怎么获取1到100的随机数?
第二种方法可以指定一个int型参数作为随机种子:int iSeed=10;Random ro = new Random(10);long tick = DateTime.Now.Ticks;Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32));这样可以保证99%不是一样。之后,就可以使用这个Random类的对象来产生随机数,这时候...

相似回答