Python_隨機序列生成_白噪聲


本文介紹如何利用Python自行生成隨機序列,實現了 Whichmann / Hill 生成器。

參考:

  [1]Random Number Generation and Monte Carlo Methods(P.47)

  [2]簡單產生白噪聲的算法

  [3]各種分布白噪聲的產生

 

基本原理


   本文粗略將隨機數分為兩種:均勻分布以及非均勻分布。均勻分布隨機數通過非線性變換可得到非均勻分布的隨機數。故而均勻分布隨機數更基本。引文[3]中提到了三種生成算法:線性同余法、聯合法、反饋位移寄存法。限於時間,簡述線性同余法:

  線性同余是基於求余計算的方法,對原始序列進行重排。該方法由一個“種子”開始,通過遞歸得到整個隨機序列[3]

\begin{equation}
x_i = ax_{i-1}+c  \quad \left(\mod m \quad \right)
\end{equation}

式中 $x_i$、$a$、$c$ 均為正整數,$x_0$ 稱為種子,$a$ 稱為乘子,$c=0$ 時稱為乘同余法,反之稱為混合同余法。

  查閱引文[3]的書,全英文,篇幅長,但還是翻了翻。翻到47頁的時候發現了很清晰的算法表述。該算法在1982年由 Wichmann 和 Hill 發表,通過三個發生器組合成一個同余發生器。因為其易於編程,且隨機性優越(書中簡述了相關研究),本文選擇該算法進行實現[1]

\begin{equation}
\begin{cases}
x_i \equiv 171x_{i-1}\mod 30269 \\
y_i \equiv 172x_{i-1}\mod 30307\\
z_i \equiv 170x_{i-1}\mod 30323\\
u_i = \left( \dfrac{x_i}{30269} + \dfrac{y_i}{30307} + \dfrac{z_i}{30323} \right) \mod 1
\end{cases}
\end{equation}

其中,發生器的種子為 $\left(x_0,y_0,z_0\right)$,是一個三元矢量。該發生器直接產生 $\left(0,1\right)$ 區間上的 $u_i$ 。可以由最終表達式看出:分母的值很大。

 

實現


    為了減少代碼量,我將 $x,y,z$ 三組數都放到了一個變量下面,名字為 x 。a 與 b 設為 np.array 格式,避免序列之間不支持對應元素的乘除求余問題。

# -*- coding: utf-8 -*-
"""
Created on Tue Aug 28
@author: adgk07
    A script to generate noise signal
"""
import numpy as np
from pylab import *
S = [1,3,7] # user defin SEED
L = 1024    # user defin LENGTH
a = np.array([171., 172, 170])
b = np.array([30269., 30307, 30323]) 
x = np.zeros((L,3))
x[0] = S
y = np.zeros(L)
y[0] = np.sum(S/b)%1
for num in np.arange(L-1):
    x[num+1] = (a*x[num])%b
    y[num+1] = np.sum(x[num+1]/b)%1
plot(y)
show()

 上述例程可改寫為函數,不在話下。

 


END


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM