天天看點

構造任意分布的随機器發生器

在蒙特卡洛模拟中(Monte CarloMethod)中經常要用到服從各種分布的随機數發生器來估計模型參數,可是在一般的程式設計語言中隻給出了服從均勻分布的随機數發生器,如C語言中的rand()函數,産生[0, RAND_MAX]中的均勻分布。在機率統計中我們可以由均勻分布構造服從任意分布的函數。

我們先看它的理論基礎,下面是大學課本中機率統計中常見的一道證明題:

已知随機變量X的分布函數為F(X),證明Y = F(X)服從[0,1]的均勻分布。

構造任意分布的随機器發生器
由此可知,對于任意的機率密度
構造任意分布的随機器發生器
,有
構造任意分布的随機器發生器
為X的分布函數,設X服從[0,1]的均勻分布,易得
構造任意分布的随機器發生器

由(1)式我們可以得到y與x間的關系式,進而已知任意分布的機率密度函數,都可以由上式的均勻分布得到其相應的分布函數。

下面來看一個密度函數為指數分布的例子:

已知:

構造任意分布的随機器發生器
,X服從[0,1]上的均勻分布,由(1)式得:
構造任意分布的随機器發生器
,得到
構造任意分布的随機器發生器

當然對于有些分布y是得不到關于x的顯函數的,但是對于計算機來說這可以利用數值分析的方法來解。

好了,說了這麼多,下面來看由C語言的rand()函數構造符合

構造任意分布的随機器發生器
的指數分布随機數發生器例子:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
using namespace std;
int main()
{
    double x, y;
    int i;
    srand(time(NULL));
    for(i = 0; i < 5000; ++i)
    {
        x = (double)rand() / RAND_MAX;//C語言的僞随機數發生器産生[0,1]的均勻分布;
        y = log(1 - x) * -1;//由均勻分布構造生成服叢指數函數的y;
        cout << y << endl;
    }
    return 0;
}