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
Python_随机序列生成_白噪声的更多相关文章
- 随机序列生成算法---生成前N个整数的一组随机序列
		
问题描述: 给定输入N,生成从1开始的:1,2,3,4,......N 一组随机序列,序列中的数不能重复出现. 比如:N=5,合法的随机序列为{4,3,1,5,2} .{3,1,4,2,5}……非法的 ...
 - python_装饰器_语法糖
		
什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...
 - python_语法糖_装饰器
		
什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...
 - Oracle主键自动生成_表and存储过程
		
-- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...
 - SQL Server主键自动生成_表and存储过程
		
主键表: CREATE TABLE [dbo].[KEYCODE]( [KeyName] [varchar](12) NOT NULL, [KeyTableName] [varchar](40) NU ...
 - Python_代码练习_写一个判断是否为小数的函数
		
这两天在学习函数,练习写一个判断是否为小数的函数,看起来蛮简单的,飞速写完很是得意,然后测了一下,发现差得好多呀,这个并不像想象那样简单,我得到的教训是,想要把一个需求哪怕再小的需求考虑周全,都不是件 ...
 - [bzoj3193][JLOI2013]地形生成_排列组合_贪心
		
[JLOI2013]地形生成 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3193 题解: 这种求总排列的题,一种常规做法就是所有的元素 ...
 - Python_面试题_更新中
		
Python-面试题 线上操作系统 centos py2和py3的区别 每种数据类型,列举你了解的方法 3 or 9 and 8 字符串的反转 is 和 == 的区别? git流程 v = (1) / ...
 - Python_汇总生成统计报表
		
import xlrd import xlwt from xlutils.copy import copy objWb = xlrd.open_workbook(r'C:\Users\IBM\Desk ...
 
随机推荐
- VUE基本常识
			
1.运行vue项目 项目根目录git Bash here npm run dev 为了能直接打开项目 配置项目package.json 添加--open 如下图: 2.坑:VUE初写小项目问 ...
 - 用node+webpack+vue新建vue项目步骤
			
1. 安装node,命令行输入node-v命令查看是否安装成功. 2. 安装vue:npm install vue-cli -g(全局安装). 3. 在想要创建vue项目的目录下,按住shift+右键 ...
 - 《BUG创造队》第二次团队作业:团队项目选题报告
			
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验六 团队作业2:团队项目选题 团队名称 BUG创造队 作业学习目标 可行性自评总结,并且采用NABCD方法进行项目初步分 ...
 - 跟踪mqttv3源码(二)
			
对于spring-mqtt.xml中的标签: <int-mqtt:message-driven-channel-adapter> <int-mqtt:outbound-channel ...
 - python 变量之小整数池跟大整数池
			
在python中定义变量会有:id,type,value.对于==比较的是value,对于is比较的是id. 因此,对于相同value的变量,它的type相同,但是它的id值可能不一样.对于相同id的 ...
 - 信用卡欺诈数据的分析-excel篇
			
本篇文章为大家提供了数据集分析的思路和步骤,同时也分享了自己的经验. 一.背景 反欺诈是一项识别服务,是对交易诈骗.网络诈骗.电话诈骗.盗卡盗号等行为的一项风险识别.其核心是通过大数据的收集.分析和处 ...
 - 关于在UNIcode环境下得TCHAR转string类型以及string转TCHAR
			
using namespace System::Text: String ^TCHARtoStr(TCHAR *temp) //TCHAR转String { array<unsigned cha ...
 - 【C语言】数组知识点总结
			
[C语言]数组知识点总结 标签: 数组 2018年04月12日 17:44:4481人阅读 评论(0) 收藏 举报 分类: C语言知识总结(4) 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
 - java.lang.NumberFormaException: For input String:"user"
			
碰到这个问题的时候有点懵逼,很无力,网上一查是类型转换错误,贴上报错的JSP代码 最后找救兵,得出是hql的错误,举个例子: HibernateUtil.query("from user u ...
 - 《程序设计入门——C语言》翁恺老师 第五周编程练习记录
			
1 素数和(5分) 题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推. 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个 ...