线性同余随机数算法实现
大部分语言的随机数都是通过”线性同余法”生成的,这是什么鬼方程(哪位好学生给科普一下)?我们不管原理,只管实现~
线性同余法的方程为:N2 = (A X N1 + B) % M
,仅当B能够被A与M的最大公约数整除,此方程有解。我们只要保证A和M互质就可以了。
下面是我用PHP的简单实现,如有错误,随便指出:
/**
* 伪随机数
* @author zhjx922
*/
class Rand {
private $_sRand;
public function __construct()
{
$this->_sRand = substr(microtime(true), -3);
}
/**
* 种子生成器
* @return string
*/
private function sRand() {
$a = 33773;
$b = 97613;
$m = 65536;
$this->_sRand = bcmod(bcadd(bcmul($a, $this->_sRand), $b), $m);
return $this->_sRand;
}
/**
* 查询随机数
* @param $start
* @param $end
* @return string
*/
public function rand($start, $end) {
if($start == $end) {
return $start;
}
if($start > $end) {
$max = $start;
$min = $end;
} else {
$max = $end;
$min = $start;
}
$sub = $max - $min;
return (int)bcmod($this->sRand(), $sub + 1) + $min;
}
}
$rand = new Rand();
$randNum = array();
for($i=0;$i<10000;$i++) {
$num = $rand->rand(-50, -66);
if(isset($randNum[$num])) {
$randNum[$num]++;
} else {
$randNum[$num] = 1;
}
}
ksort($randNum);
var_dump($randNum);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
大家可以复制代码到本地跑一下,看看生成的效果如何,生成的随机数是否足够”随机”
上次更新: 2022/12/01, 11:09:34