【 C/C++ & Python】随机数产生

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值