线性同余发生器学习笔记
前言
大家好,今天我忘记了 mt_19937、rand 等函数和 C++ 的使用方法,但我想使用随机化,于是我学会了线性同余发生器。
这真是我写过内容最浅显的文章了,我自己都觉得丢人。
介绍
线性同余发生器是一种简单的随机数生成算法,如果
显然这是一个递推公式,其中
然后我们来研究线性同余发生器生成的随机数有什么性质。
首先根据这个递推式,我们可以发现如果
然后我们又可以观察到周期的上限是
但很多时候周期的长度取不到上限
所以我们要研究怎样选取
我们可以先尝试一个例子,其中
(define (next x k b m)
(remainder (+ (* k x) b) m))
(define rand
(let ((x 1)
(k 1145141)
(b 0)
(m 4294967295))
(lambda ()
(set! x (next x k b m))
x)))
(我依然没有想起怎么用 C++)
(如果你不知道 Scheme 是什么以及怎么使用,可以去阅读《计算机程序的构造与解释》)
这个随机数生成器看起来随机性还不赖,我们可以通过蒙特卡罗法来检验一下:
(define (monte n)
(define (rnd)
(/ (rand) 4294967295.0))
(let it ((res n)
(d 0))
(if (= res 0)
(/ (* 4.0 d) n)
(it (- res 1)
(+ d
(let ((x (rnd))
(y (rnd)))
(if (<= (+ (* x x) (* y y)) 1) 1 0)))))))
然后 load 之后用 (monte 114514) 启动,第一次计算的结果是
[^1]: 在我想起 C++ 的 rand 的参数后,我尝试以
于是我们得出了结论:
好吧,其实我也不知道,网上也没有找到什么这方面的资料,但这里有一些其他例子:^2
| 名称 | |||
|---|---|---|---|
| RANDU | |||
| MINSTD | |||
| Numerical Recipes | |||
glibc rand() |
|||
| MSVC++ |
参考文献(不撒花了)
线性同余发生器_百度百科
算法:线性同余法(LCG,Linear Congruential Generator)-CSDN博客
线性同余发生器与伪随机数 - Qcer - 博客园
随机函数 - OI Wiki