C++中有两种方式:第一种方式是使用<cstdlib>中的rand()函数,这是ANSI C标准,在gcc/g++编译器中也直接可用;第二种方式是使用<random>库文件,下面对这两种方法进行介绍:
1、<cstdlib> & rand()
rand() 函数在头文件<cstdlib> 中,产生的随机数为无符号整数,在0~RAND_MAX 之间,而 RAND_MAX 的值与 int 位数有关,最小是32767——对应16位 int,如果要控制随机数范围需要自己编写一个简单的函数。程序每次运行 rand() 都会生成相同的随机数序列,这在一定程度有利于程序的调试,但我们有时需要每一次运行产生的随机数序列都是不同的。我们可以通过设置随机数引擎的种子来改变引擎的状态,没有改变时是使用默认的随机数种子 1,这就是为什么每一次都生成同样的随机数序列。设置随机数种子用到 srand() 函数,一般为了避免手动输入的非随机性,我们使用程序启动时间 time() 作为随机数种子,此时需要包含 <ctime> 库文件。示例代码如下:
#include <cstdlib> //包含rand函数的库
#include <ctime>
#include <iostream>
using namespace std;
int randInt(int lowerBound, int upBound) {
//产生[a,b)范围内的随机整数
return rand() % (upBound - lowerBound) + lowerBound;
}
float randDecimal() {
//产生0~1内的小数
return rand() / double(RAND_MAX);
}
int main() {
srand((unsigned)time(0));
for (int i = 0;i < 10;i++)
cout << randInt(0, 100) << '\t' << randDecimal() << endl;
return 0;
}
2、<random> 随机数库
C++11提供的<random>实现了随机数库,它通过随机数引擎类 random_number_engines 产生随机数序列,随机数分布类 random-number distribution 使用随机数引擎生成服从特定概率分布的随机数。和 rand() 一样,default_random_engine 对象也需要设置随机种子,用到方法 default_random_engine.seed( )。如果想要改变生成的范围就需要使用随机数分布类,如 均匀分布 uniform_int_distribution<unsigned>、uniform_real_distribution<double>,正态分布 normal_distribution<>等等。代码如下:
#include <random>
#include <ctime>
#include <iostream>
using namespace std;
int main() {
default_random_engine e(unsigned(time(0))); //创建随机数列对象并设置种子
e.seed(10); //将种子改为 10
uniform_int_distribution<unsigned> iu(0, 9); //均匀分布,整数 0~9
uniform_real_distribution<double> ru(0, 1); //均匀分布,小数 0~1
normal_distribution<> n(4, 1.5); //正态分布,均值为4,方差为1.5
for (size_t i = 0; i < 10; ++i)
//注意e是函数对象,调用需要加()
cout << e() << '\t' << iu(e) << '\t' << ru(e) << '\t' << n(e) << endl;
return 0;
}
Python 创建随机数就要简单的多了,直接导入 random 模块,然后调用该模块中的方法。代码如下:
import random
for i in range(10):
print(random.random()) # 产生 0~1 的随机数字
print(random.randint(0, 10)) # 产生 0~10 之间的整数
print(random.randrange(0, 10, 2)) # 产生 range(0,10,2) 内的随机数
print(random.uniform(0, 10)) # 产生 0~10 之间的均匀分布数
print(random.normalvariate(4, 1.5)) # 正态分布,期望为4,方差为1.5