本文介绍如何利用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

最新文章

  1. Qt Disable QDebug And Warning Output
  2. 深入理解 OWIN 中的 Host 和 Server
  3. [1]IP地址查询
  4. git 笔记
  5. jquery的load和get的区别
  6. 实验一Java开发环境的熟悉
  7. 在PC上收发短信--Pidgin短信(Linux Pidgin插件)
  8. 一个简单的定时器(NSTimer)的封装
  9. OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)
  10. 批量删除ASP.NET中的缓存(cache)
  11. java—— finall 关键词
  12. C++中不能被重载的运算符介绍
  13. H5移动端项目案例、web手机微商城实战开发
  14. D. Concatenated Multiples(离线处理)
  15. 【论文速读】Shitala Prasad_ECCV2018】Using Object Information for Spotting Text
  16. opencv dlib caffe 安装
  17. css的em是根据什么来写的
  18. java提高(3)---正则表达式(2)
  19. 和docket的第一次亲密接触
  20. K组翻转链表 · Reverse Nodes in k-Group

热门文章

  1. c++ switch和case的用法
  2. Python3+Appium安装使用教程
  3. JVM工具jstat使用说明
  4. Tsinghua 2018 DSA PA2简要题解
  5. day2 购物车
  6. K8S配置安装全过程
  7. es6(二)
  8. arp嗅探(windows)
  9. apm固定翼调试方法
  10. .NET快速开发平台免费版预发布