Random Number Generators (随机数生成器)

  1. 模运算(Modular Arithmetic)
  2. 线性同余生成器(Linear Congruent Generators)
  3. 生成均匀变量(Generating Uniform Variates)

模运算(Modular Arithmetic)

w,mw,mw,m,均为整数,模运算表示为:w%mw \% mw%m。

例:m=5,w=1m = 5, w = 1m=5,w=1, w%m=1%5=1w \% m = 1 \% 5 = 1w%m=1%5=1

同余(congruent modulo)

例:w=1,6,11,16,m=5w = 1, 6, 11, 16, m = 5w=1,6,11,16,m=5, 1, 6, 11, 16 对模m=5m=5m=5同余:

1%5=06%5=111%5=116%5=1\begin{aligned}1 \% 5 &= 0 \\ 6 \% 5 &= 1 \\ 11 \% 5 &= 1 \\ 16 \% 5 &= 1 \end{aligned}1%56%511%516%5​=0=1=1=1​

线性同余生成器(LCG : Linear Congruent Generators)

LCG有三个参数a,b,ma, b, ma,b,m,重复进行模运算,用前一个wi−1w_{i-1}wi−1​,计算得到wiw_iwi​:
wi=(a×wi−1+b)%mw_i = (a \times w_{i-1} + b) \% mwi​=(a×wi−1​+b)%m

例: a=5,b=3a = 5, b = 3a=5,b=3, w0=11w_0 = 11w0​=11, wi=(5×11+3)%mw_i = (5 \times 11 + 3) \% mwi​=(5×11+3)%m:

  1. m=13m = 13m=13
  2. m=23m = 23m=23
  3. m=32m = 32m=32
  4. w0=33,m=32w_0 = 33, m= 32w0​=33,m=32

下面是4种不同的参数组合的测试结果:

import numpy as np
import matplotlib.pyplot as plt
def LCG(seed, m=32):w = (5 * seed + 3) % mreturn w

当m=13m=13m=13时序列重复的周期最短,m=23m=23m=23时序列周期T=22T=22T=22,m=32m=32m=32时,T=32T=32T=32。只有特定的参数组合生成的序列周期T=mT = mT=m,在参数不变的情况下,改变seed会生成新的随机序列,但是周期不变。

生成均匀变量(Generating Uniform Variates)

标准的连续均匀随机变量用uuu表示,uuu可以从LCG生成的序列转换得到,即:
ui=wim,u∈[0m,m−1m],w∈[0,m−1]u_i = \frac{w_i}{m},u \in [\frac{0}{m}, \frac{m-1}{m}], w \in [0, m-1]ui​=mwi​​,u∈[m0​,mm−1​],w∈[0,m−1]

(0,1)(0,1)(0,1)之间均匀随机变量:

32位字长(32-Bit Word Length)

32位可以表示的整数范围是[−(231−1),231][-(2^{31}-1), 2^{31}][−(231−1),231],1位确定符号,31位确定数值。

生成32位整数范围内的均匀随机变量,且使T=m=231−1T = m = 2^{31}-1T=m=231−1:

  • a=16807,b=0a = 16807, b = 0a=16807,b=0
  • a=630360016,b=0a = 630360016, b= 0a=630360016,b=0

评估随机数生成器(Evaluate Random Number Generator)

由一下几个方面测试均匀变量的好坏:

  • 随机序列的周期即不重复的长度(Length of the Cycle)
  • 均值和方差(Mean and Variance)
  • 卡方(Chi Square)
  • 自相关(Autocorrelation)
序列的周期
  • 随机序列的周期应T≈mT \approx mT≈m或$T = m,即:序列周期的长度等于模或尽可能等于模的值。
均值和方差

均匀随机变量序列U=u1,u2,u3,...un,U∈[0,1)U = {u_1, u_2, u_3,...u_n}, U \in [0, 1)U=u1​,u2​,u3​,...un​,U∈[0,1),随机变量的均值和方差为:E(u)、V(u)E(u)、V(u)E(u)、V(u)。E(u)=0.5,V(u)=0.0833E(u) = 0.5, V(u) = 0.0833E(u)=0.5,V(u)=0.0833,序列的均值和方差差距反映了序列的好坏。

卡方

序列U=u1,u2,u3,...un,U∈[0,1]U = {u_1, u_2, u_3,...u_n}, U \in [0, 1]U=u1​,u2​,u3​,...un​,U∈[0,1],在UUU上划分kkk个等间隔的区间。k=10k = 10k=10,区间为:(0,0.1),(0.1,0.2),...(0.9,1.0)(0,0.1),(0.1,0.2),...(0.9,1.0)(0,0.1),(0.1,0.2),...(0.9,1.0)。用fif_ifi​表示序列UUU中落入第iii个区间的值的数量,nnn为序列中全部元素的数量。理想的情况下落入每个区间的数量,ei=1kne_i = \frac{1}{k}nei​=k1​n。卡方检验用来检验随机序列是否均匀分布。

自相关

计算序列与自身不同滞后的相关性,理想情况下应该接近于0。当滞后为kkk:
rk=∑i(ui−0.5)(ui−k−0.5)∑i(ui−0.5)2r_k = \frac{\sum_i(u_i - 0.5)(u_{i-k} - 0.5)}{\sum_i(u_i - 0.5)^2}rk​=∑i​(ui​−0.5)2∑i​(ui​−0.5)(ui−k​−0.5)​

伪随机

LCG生成的序列并不是真正的随机数,在最理想的情况下,序列重复出现的周期等于模,所以序列的顺序是可预测的。

MCS:随机数的生成相关推荐

  1. C语言经典小游戏---猜数字游戏 (包含C语言中如何实现随机数的生成)

    题目描述:输入1-100之间的数字,进行猜数字游戏,猜大猜小有提示,直至才对为止,游戏可以重复游玩. 算法思路: 1.用void函数分别写出菜单程序与游戏进程程序. 2.用switch-case-de ...

  2. Linux真随机数的生成

    今天看<白帽子讲WEB安全>一书,看到笔者谈到Linux如何实现真随机数生成,感觉非常有用,记录下来 #include<iostream> using namespace st ...

  3. 随机数的生成 java

    随机数的生成 java 名词说明 左闭右开,指的是左边的数包含右边的数不包含 例如 生成0-10之间的随机数,左闭右开 指产生的数中包含左边的0(闭),不包含右边的10(开) 闭指包含,开指不包含 生 ...

  4. 随机数的生成【详解】

    生成随机数 rand函数可以生成随机数,随机数的范围在0~RAND_MAX(32767)之间 在使用rand函数之前,需要调用srand函数,设置随机数的生成起点 srand函数:void srand ...

  5. JAVA中随机数的生成方法

    一.第一种:使用Math类中的random方法 该方法的返回数值为[0.0,1.0)的double类型数,由于double类数的精度很高,可以在一定程度下看做随机数,借助(int)来进行类型转换就可以 ...

  6. C#产生随机数之一 生成真随机数

    Random 成员 名称 ● 说明 Equals ● 确定指定的 Object 是否等于当前的 Object.(继承自 Object.) Finalize ● 允许Object 在"垃圾回收 ...

  7. 用于生成随机数的python标准库模块是_详解Python基础random模块随机数的生成

    详解Python基础random模块随机数的生成 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  详解Python基础random模块随机数的生成.txt ] ( ...

  8. python random库生成伯努利随机数的方法_详解Python基础random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  9. 从《羊了个羊》看随机数的生成原理

    你的<羊了个羊>第二关通关了吗? 作为一款三消类的休闲小游戏,<羊了个羊>虽然在玩法上并没有多大创新,但却以其相邻关卡间巨大的游戏难度落差成功出圈.讨论度提高的同时,也招致了一 ...

  10. java生成指数分布随机数_生成特定分布随机数的方法

    生成随机数是程序设计里常见的需求.一般的编程语言都会自带一个随机数生成函数,用于生成服从均匀分布的随机数.不过有时需要生成服从其它分布的随机数,例如高斯分布或指数分布等.有些编程语言已经有比较完善的实 ...

最新文章

  1. 《libGDX移动游戏开发从入门到精通》一第2章 libGDX的架构分析
  2. Shiro结合redis的统一会话管理:自定义会话管理器
  3. 为什么mysql与eclipse_mysql的用户名和密码都是正确的,但是eclipse启动说不对
  4. 在日志中搜索时间间隔
  5. 【计算机网络复习 数据链路层】3.5.4 CSMA-CD协议
  6. java.lang.StackOverflowError递归的栈溢出错误
  7. 通过样式class也是可以控制超链接是否弹窗
  8. 线性独立路径_设计一个线性电源电路,需要准备哪些元器件呢?
  9. 【基音频率】基音matlab基音频率计算【含Matlab源码 1384期】
  10. 电商系统架构全链路解析
  11. Flask 个人网站重构上线
  12. 工作表冻结前两行_冻结所有工作表宏
  13. 蒙氏三段卡---马三段卡
  14. 237. 删除链表中的节点
  15. 触发器(数据库原理术语)
  16. Jetson Nano开发深度学习实践(六) :工作站(主机)装机-NVIDIA显卡驱动,Cuda,Cudnn
  17. 老友记全10集看完了,2个月的时光一晃而过!
  18. android 自定义view仿通讯录
  19. 51Nod-1106质数检测
  20. Docker介绍与使用

热门文章

  1. JavaWeb9大内置对象的作用与作用域
  2. 向视图中插入的数据能进入到基本表中去吗?_数据库调优,调的是什么及常见手法...
  3. 盒模型知识点汇总(附实例、图解)
  4. 当我们调用yield,它究竟做了什么
  5. APK反编译之二:工具介绍
  6. java练习题-求int类型N值的阶乘
  7. Newtonsoft.Json序列化和反序列之javascriptConvert.SerializeObject,DeserializeObject,JsonWriter,JsonReader...
  8. Xcode6无法安装VVDocumenter插件的解决方法
  9. display:table-cell 在页面中的应用
  10. Java中String,StringBuffer,StringBuilder的区别及其使用