线性同余法[纯理论]
现在的随机函数发生器大都采用的是线性同余法。
同余的概念是这样描述的:
设m是一个给定的正整数,如果两个整数a,b用m除,所得的余数相同,则称a,b对模m同余。
所谓线性同余法(又叫混合同余法),就是这样的一个公式:X[i+1]=(A*X[i]+C) mod M;
经前人研究表明,在M=2^q的条件下,参数A,C,X[0]按如下选取,周期较大,概率统计特性好:
A=2^b+1=2^(log2(M)/2)+1=2^log2(sqrt(M))+1=sqrt(M)+1;b取q/2 附近的数
C=(1/2+sqrt(3))*M
X[0]为任意非负数
M , 模数 0 < M
A, 乘数 0 <= A<M
C, 增量 0 <=C<M
Xi,开始值 0<=Xi<M
它的一个致命的弱点,那就是随机数的生成在某一周期内成线性增长的趋势,显然,在大多数场合,这种极富“规律”型的随机数是不应当使用的。
同余序列总是进入一个循环,这是一个事实,它最终必定在N个数之间无休止的重复循环。
使用该方法产生的伪随机数能不能近似真正的随机效果,跟四个整数的设置相关:
1. 序列的开始值,一般取正整数。
2. m:一个同余序列的周期不可能多于m个元素,所以,为了达到预期的随机效果,一般我们希望这个值稍稍大一点。在大多数情况下,当m = 2e(e表示计算机的字大小)时,在计算机中得到的随机效果就比较令人满意了。而且这样对于随机数生成速度也是比较合理的。
3. a:当a=1的时候,Xn=(X0+nc)mod m ,它不具有随机序列的特性;而当a=0的时候甚至更糟糕。因此,为实用起见,选择2 <= a<m比较合理。
4. c:当c=0时,数的生成过程比c!=0的时候要稍微快些,它的限制缩短了这个序列的周期长度,但是也仍然有可能得到一个相当长的周期。当c=0时被称为乘同余法,c!=0称为混合同余法。为了一般性,我建议选择采用混合同余法。
由m,a,c和X0所定义的线形同余序列得到最大的周期长度m的条件如下:
当且仅当
(1)c与m互素。
(2)对于整除m的每个素数p,2^b=a-1是p的倍数。
(3)如果m是4的倍数,则b也是4的倍数。
就像开始提到的,伪随机数的产生都是由一个起始种子数开始的,上面描述的就是由一个种子数下能够产生的随机数的序列。这个序列的周期性是必然的,当这个周期能够满足预期的效果的时候,就是我们看到的满意的随机效果。
在确定初始种子数的时候,可以有多种形式,例如将某时刻的时钟数据做种子,通过时间的不停变化,进行随机数的求取来达到随机效果。这些都是方法问题了,不在算法讨论范畴。
线性同余法[纯理论]相关推荐
- 【随机数生成算法系列】线性同余法和梅森旋转法
一般我们用到的随机算法都是伪随机算法,什么叫伪随机算法呢?伪随机算法意思是假如知道第一个随机种子和随机算法的话就可以推算出下一个随机数.通常我们程序里都是通过当前时间作为随机函数的第一个随机种子,然后 ...
- OpenCV(22)SIFT尺度不变特征变换(纯理论)
SIFT算法(纯理论) 1.引言 前面介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性.以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使 ...
- 随机算法求pi、线性同余法求random、拉斯维加斯算法python
一.随机算法求pi # 计算圆周率 import pdb import random def CalcPai(n):# 计算π值k = 0for i in range(0,n):x = random. ...
- 数据分析与挖掘理论-常用算法对比(纯理论较枯燥)
常见数据挖掘算法分析 概述 一般认为,数据挖掘领域所使用的方法均属于机器学习算法.深度学习算法和数据挖掘算法. 一般认为,数据挖掘领域的问题主要有分类.回归.聚类.推荐.图像识别.预测. 一般认为,数 ...
- 今夜喜雨 | 直线线性三角化理论
雨夜,用了两个小时的时间终于推导了直线三角化的公式.直线三角化? 是的,即通过两帧的匹配直线得到空间直线的端点,如果端点严格匹配那么就是点的三角化,你可以从<SLAM十四讲>一书或者其他的 ...
- RNG分析:线性同余法 LCG
古老的LCG(linear congruential generator)代表了最好最朴素的伪随机数产生器算法.主要原因是容易理解,容易实现,而且速度快. LCG 算法数学上基于公式: X(n+1) ...
- 详解Eureka服务注册与发现和Ribbon负载均衡【纯理论实战】
Eureka服务注册与发现 Eureka简介 在介绍Eureka前,先说一下CAP原则 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability ...
- G1垃圾收集器设计目标与改良手段【纯理论】
在之前已经详细对CMS垃圾回收器进行了学习,今天准备要学习另一个全新的垃圾收集器---G1(Garbage First Collector 垃圾优先的收集器),说是一种全新的,其实G1垃圾收集器已经出 ...
- sharding-jdbc(ShardingSphere )、mycat、DRDS 三个分布式数据库中间件的简单介绍(纯理论说明)
文章目录 1.前言 2.sharding-jdbc 3.mycat 4.DRDS 5.总结 1.前言 一般对于业务记录类随时间会不断增加的数据,当数据量增加到一定量(一般认为整型值为主的表达到千万级, ...
- 线性同余法产生随机数C语言,线性同余生成随机数的一点思考
今天下午 pk 和我讨论了一个问题,他看到在另一个项目组的 lua 代码里有一段使用线性同余产生随机数的代码,但是那个项目组的同事告诉他这个函数生成的随机数是分布不均的.于是他想到了我前两天给他讲的关 ...
最新文章
- Windows常用工具
- 2019CCPC网络选拔赛签到题题解
- 香港四大天王影帝情况(截止2016)
- mysql查看触发器_在mysql中如何查看和修改触发器的代码?请问各位大师,小弟先谢谢了!!!!!!!!!...
- Node 实现 AES 加密,结果输出为“byte”。
- 【干货】深度学习实验流程及PyTorch提供的解决方案
- 不同数据量下主键类型的选择
- 在小县城做什么赚钱?来看看这十种赚钱的项目吧!
- 过支付宝反Xposed登录检测
- 有什么可以赚钱的副业?日入300元就靠这几个副业!
- 三年磨一剑:蚂蚁金服的研发效能洞察实践
- php幸运大抽奖,幸运大转盘-jQuery+PHP实现的抽奖程序-完善中
- Proxmox VE 桌面虚拟化(windows 10)集群尝试
- 嵌入式之linux入门篇
- HTML中视频默认显示自定义图片
- 手机刷机是什么意思?快速了解手机刷机基本概念
- 芯片RK3399性能介绍
- php 使用dataview,ECMAScript6中的二进制数据(ArrayBuffer + TypedArray + DataView)
- 使用Adaboost训练车牌定位——(1)
- psp3000电池测试软件,最简单鉴别PSP原装/组装电池的方法