1. 程式人生 > >【C++】隨機數rand( ) 和 隨機數引擎

【C++】隨機數rand( ) 和 隨機數引擎

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帶來的隨機數生成器