隨機數生成算法(整數、小數和正態分佈)(附代碼)

首先定義RandomNumber類的時候,我們就定義了一個構造函數,每次調用就會產生隨着系統時間變化的隨機種子,這樣我們就可以避免生成僞隨機數,小數和整數隨機數的生成比較好理解,而服從正態分佈的隨機數本文采用的是Box–Muller算法,它可以通過兩個服從(0,1)均勻分佈的隨機數構造服從正態分佈的隨機數。

Box-Muller算法

當x和y是兩個獨立且服從(0,1)均勻分佈的隨機變量時,有

                                             Z_{1}=cos(2\pi x)\cdot \sqrt{-2ln(y)}

                                            Z_{2}=sin(2\pi x)\cdot \sqrt{-2ln(y)}

Z1和Z2獨立且服從標準正態分佈,當帶入均值和方差時,

                                                 Z=Z_{1}(Z_{2})\cdot \sigma +\mu

Z就可以產生服從(μ,σ2)正態分佈的隨機數,本文采用的是Z1。

實例

設置隨機產生20組(-100,100)的整數,(0,1)的小數,服從(0,1)正態分佈的隨機數

c++代碼

#include <iostream>
#include <ctime>
#define  PI    3.1415926535897    //π值
using namespace std;
//==========================隨機產生均勻分佈的小數、整數和服從高斯分佈的隨機數=========================
class RandomNumber
{
public:
	RandomNumber() {
		srand((unsigned)time(NULL));    //析構函數,在對象創建時數據成員執行初始化操作
	}
	int integer(int begin, int end)
	{
		return rand() % (end - begin + 1) + begin;
	}
	double decimal(double a, double b)
	{
		return double(rand() % 10000) / 10000 * (b - a) + a;
	}
	double GaussianNoise(double mu, double sigma)
	{
		return sigma * sqrt(-2 * log(decimal(0, 1)))*cos(2 * PI*(decimal(0, 1))) + mu;
	}
};
int main()
{
	RandomNumber r;//定義隨機數
	cout << "   " << "整數" << "      " << "小數" << "     " << "服從(0,1)正態分佈" << endl;
	for (int i = 0; i < 20; i++)
	{ 
		cout << "    " << r.integer(-100, 100) << "      " << r.decimal(0, 1) << "        " << r.GaussianNoise(0, 1) << endl;
	}
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章