Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 操作系统

  • 计算机网络

  • 数据结构和算法

    • 数据结构

    • 算法

      • 常见排序算法实现
      • 常见搜索算法实现
      • Leetcode刷题之1.两数之和
      • 线性同余随机数算法实现
      • 深入理解递归算法
      • 二叉搜索树转双向链表
  • MySQL

  • Redis

  • Nginx

  • MongoDB

  • 其他

  • 计算机基础
  • 数据结构和算法
  • 算法
Ravior
2017-02-07

线性同余随机数算法实现

大部分语言的随机数都是通过”线性同余法”生成的,这是什么鬼方程(哪位好学生给科普一下)?我们不管原理,只管实现~ 线性同余法的方程为: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

大家可以复制代码到本地跑一下,看看生成的效果如何,生成的随机数是否足够”随机”

#算法#数据结构
上次更新: 2022/12/01, 11:09:34
Leetcode刷题之1.两数之和
深入理解递归算法

← Leetcode刷题之1.两数之和 深入理解递归算法→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式