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

Python_随机序列生成_白噪声的更多相关文章

  1. 随机序列生成算法---生成前N个整数的一组随机序列

    问题描述: 给定输入N,生成从1开始的:1,2,3,4,......N 一组随机序列,序列中的数不能重复出现. 比如:N=5,合法的随机序列为{4,3,1,5,2} .{3,1,4,2,5}……非法的 ...

  2. python_装饰器_语法糖

    什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...

  3. python_语法糖_装饰器

    什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...

  4. Oracle主键自动生成_表and存储过程

    -- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...

  5. SQL Server主键自动生成_表and存储过程

    主键表: CREATE TABLE [dbo].[KEYCODE]( [KeyName] [varchar](12) NOT NULL, [KeyTableName] [varchar](40) NU ...

  6. Python_代码练习_写一个判断是否为小数的函数

    这两天在学习函数,练习写一个判断是否为小数的函数,看起来蛮简单的,飞速写完很是得意,然后测了一下,发现差得好多呀,这个并不像想象那样简单,我得到的教训是,想要把一个需求哪怕再小的需求考虑周全,都不是件 ...

  7. [bzoj3193][JLOI2013]地形生成_排列组合_贪心

    [JLOI2013]地形生成 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3193 题解: 这种求总排列的题,一种常规做法就是所有的元素 ...

  8. Python_面试题_更新中

    Python-面试题 线上操作系统 centos py2和py3的区别 每种数据类型,列举你了解的方法 3 or 9 and 8 字符串的反转 is 和 == 的区别? git流程 v = (1) / ...

  9. Python_汇总生成统计报表

    import xlrd import xlwt from xlutils.copy import copy objWb = xlrd.open_workbook(r'C:\Users\IBM\Desk ...

随机推荐

  1. JDK8下Object类源码理解

    JDK8中Object类提供的方法: package java.lang; /** * Class {@code Object} is the root of the class hierarchy. ...

  2. Js 框架之Vue .JS学习记录 ① 与Vue 初识

    目录 与 Vue.js 认识 VUE.JS是个啥?有啥好处? Vue 的目标 战前准备  VUE.JS环境 VUE.JS 尝试一下,你就明白 第一步 实例化VUE 对象 第二步VueAPP 调用数据 ...

  3. C#: int 与 byte[] 互转

    public static int ToInt32(params byte[] v) { ; var len = v.Length; ) { len = ; } ; i < len; i++) ...

  4. AutoLayout的坑

    本文投稿文章,作者:MangoMade(简书) AutoLayout非常强大也非常易用,可读性也很强,加上各种第三方AutoLayout库,让你布起局来犹如绷掉链子的狗!根本停不下来!以前的 1 la ...

  5. SpringBoot是什么,可以做什么?

    SpringBoot简析 1.SpringBoot是什么?    在Spring框架这个大家族中,产生了很多衍生框架,比如 Spring.SpringMvc框架等,Spring的核心内容在于控制反转( ...

  6. springmvc核心技术

    目录 异常处理 类型转换器 数据验证 文件上传与下载 拦截器 异常处理 Spring MVC中, 系统的DAO, Service, Controller层出现异常, 均通过throw Exceptio ...

  7. linux服务器用nginx做网站内页之间301的跳转方法

    例: 要将这个页面 /topic/show-228-1.html 做301跳转到 /dance/topic-show-228-1.html nginx的伪静态规则就这样写: rewrite ^/top ...

  8. webstorm使用YUIcompressor压缩js css并指定目录

    YUI插件下载地址: https://github.com/yui/yuicompressor/releases 配置教程: 注意:这里用 ..\ 代表上级目录, '\' 千万别写成 '/'

  9. solrcloud jsonfacet分组聚合 unique计数不准确

    jsonfacet分组聚合查询 unique.hll函数问题: 对不同的值进行估算,并非准确的值, 优点:节省内存消耗,用分组算法对不同的值count进行估算 缺点:无法准确统计count(disti ...

  10. AJAX 解决什么问题?如何使用AJAX?AJAX 有什么问题需要注意?项目中哪里用到了AJAX?

    ajax 解决的问题就是“无刷新更新页面”,用传统的HTML 表单方式进行页面的更新时,每次都要将请求提交到服务器,服务器返回后再重绘界面,这样界面就会经历:提交→变白→重新显示这样一个过程,用户体验 ...