【C++】随机数rand( ) 和 随机数引擎

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HelloZEX/article/details/83650539

rand()

  • 基本:使用随机数时,经常见到的是C标准库提供的函数rand(),这个函数会生成一个0RAND_MAX(32767)之间的一个整形数;
  • 分布:为了得到一个给定范围内的随机数,通常会对生成的随机数取余:rand()%n,rand()%(n-m)+m
  • 种子:通过srand()设置随机数种子,种子不变的情况下,每次程序运行,调用rand(),都会生成相同的随机数序列
  • 浮点:使用double(rand())/RAND_MAX可以生成0-1范围内的随机浮点数,但精度会有问题;
  • 通式
    产生一定范围随机数的通用表示公式是:
    
    取得(0,x)的随机整数:rand()%x;
    取得(a,b)的随机整数:rand()%(b-a);
    取得[a,b)的随机整数:rand()%(b-a)+a;
    取得[a,b]的随机整数:rand()%(b-a+1)+a;
    取得(a,b]的随机整数:rand()%(b-a)+a+1;
    取得0-1之间的浮点数:rand()/double(RAND_MAX)。
  • 一般情况下,srand()种子可以使用time(0)进行设置,time()取系统的秒,所以如果srand()和rand()的调用间隔小于1s,则会生成相同的随机数,如:
int main() 
{
	for (size_t i = 0; i < 10; i++)
	{
		//Sleep(3);
		srand(time(0));
		cout << rand() << endl;
	}

	return 0;
}

C++11 : default_random_engine

  • 基本:C++11提供了新的随机数生成器,随机数引擎default_random_engine,使用时包含头文件#include<random>
  • 范围:默认情况下,default_random_engine的生成范围是一个unsigned,可以通过方法min()和max()获取生成范围;
  • 种子:与rand()类似,default_random_engine也需要通过随机数种子改变生成的序列,设置方法可以通过调用方法seed()
  • 分布和浮点:随机数引擎可以通过分布对象设置生成范围,uniform_int_distribution<unsigned>或uniform_real_distribution<double>
  • 相对rand(),可以使用uniform_real_distribution<>生成随机浮点数,并且不用担心精度问题,随机数引擎的使用方法如下:
#include <iostream>
#include <random>
using namespace std;

int main() 
{
	default_random_engine e;//定义随机数引擎
	uniform_int_distribution<unsigned> id(1, 10);//整型分布
	uniform_real_distribution<double> dd(0, 1.0);//浮点型分布

	e.seed(time(0));//设置随机数种子
	for (size_t i = 0; i < 10; i++)
	{
		cout << id(e) << " ; " << dd(e) << endl;
	}

	return 0;
}

输出:


扩展:

C++11带来的随机数生成器

猜你喜欢

转载自blog.csdn.net/HelloZEX/article/details/83650539