线性同余法生成伪随机数

备份自:http://blog.rainy.im/2015/08/21/lcg-random-number-generator/

SICP中1.2.6素数检验一节中采用概率算法,通过随机抽样的方法利用费马小定理测试来检验给出的整数是否为素数。这里需要用到随机数生成的方法(random n),即:随机返回0到n之间的任意整数,而我用的Calysto Scheme Kernel恰好没有相应的随机数生成方法的实现。之前有遇到Matlab进行随机模拟的时候,由于没有设定seed,导致运行了很久的程序一直在周期性地重复固定的“随机数”,刚好借此机会研究一下随机数生成的原理及方法。

计算机生成随机数的方法一般是采用数学法,即根据某一(递推)公式产生一个周期性足够大的数列,满足一定的均匀分布的特性,其优点在于可以迅速产生大量伪随机数,缺点是所产生的并非真正的随机数,只是近似随机。不同的公式能够产生性质不同的伪随机数(列),一种简单常用的方法称为线性同余发生器(Linear Congruence Generator, LCG),其公式如下:

$$
\begin{cases}
X_0 = SEED, & \text{设定初始值}\\X_n = (A * X_{n-1} + B) (Mod M)\\ R_n = X_n/M
\end{cases}
$$

显然LCG方法产生的随机数列周期小于$M$,同时在保证周期尽量大的情况下,还需要适时地重设初始值,一般以系统时间作为“种子”设定初始值。Scheme的实现如下,假设将常量设定为 $A = 3, B = 0, M = 5$:

;; random.scm
(define SEED 1)
(define (seed i) (set! SEED i))
(define A 3)
(define B 0)
(define M 5)

(define (LCG)
  (begin
   (seed (remainder (+ (* A SEED) B) M))
      SEED))
(define (random n)
  (round (* (/ (LCG) (- M 1)) n) ))

将初始值设定为系统时间后,检验10次$[0, 100]$随机数产生结果:

;; test your random
(define (test-rands n)
  (if (= n 0)
      (display "Done!")
      (begin
       (display (random 100))
       (newline)
       (test-rands (- n 1)))))
(seed (round (current-time)))
(test-rands 10)

;; 75
;; 100
;; 50
;; 25
;; 75
;; 100
;; 50
;; 25
;; 75
;; 100
;; Done!

可以发现,在$A = 3, B = 0, M = 5$的条件下,LCG产生的随机数列周期仅为4,若要得到最大周期,需要满足:

  1. $B, M$互质;
  2. $M$的所有质因数都能整除$A-1$;
  3. 若$M$是4的倍数,$A-1$也是;
  4. $A,B,X_0$都比$M$小;
  5. $A,B$是正整数。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 10,249评论 0 5
  • 最喜欢榛子蛋糕 细腻顺滑的奶油口感 淡淡的清香感 不属于甜腻的味道 真的是最爱呀 配一壶红茶或者玄米 清新清香的融...
    li_magazine阅读 317评论 0 0
  • 第十四章 评估的原则 评估是一个复杂、评价的过程,在订立治疗协议之前进行。 我们关注情感直至他在客体关系历史中的根...
    心理学工作者_张旭兰阅读 142评论 0 0
  • 又到周五啦,对的,我又休息了!什么叫又嘛?周五休息是定下来的!周周复周周啊,越长大越觉得时间的指针走的越快,那么,...
    行云流水畅遨游阅读 255评论 0 2
  • 1.几张图片看清缓冲机制 2.NSURLCache的7种常见用法 3.NSURLRequest的7种缓冲机制 4....
    煎饼侠拯救不快乐阅读 618评论 0 1