计算机随机数是如何生成的?(平分取中法、线性同余法)

  • 平方取中法
    • 输出
    • 统计结果1
    • 统计结果2
  • 线性同余法
    • 输出
    • 统计结果
  • 欢迎关注微信公众号:Java后台开发

随机数无疑是计算机程序设计中极其重要的一个东西,无论是完成简单的抽奖小程序还是使用蒙特卡洛方法都需要使用随机数,而很多人每天都在使用随机数,却不知道随机数是怎么生成的。

平方取中法

平方取中法是我们的计算机之父冯·诺依曼提出的。此法开始取一个2s位的整数,称为种子,将其平方,得4s位整数(不足4s位时高位补0),然后取此4s位的中间2s位作为下一个种子数,并对此数规范化(即化成小于1的2s位的实数值),即为第一个(0,1)上的随机数。以此类推,即可得到一系列随机数。
它的算法公式如下

其中u代表生成的随机数,x代表种子数
我们来看看计算机之父提出的随机数算法效果如何,令s = 2,x = 6666,来输出10个数看看

public class Random{  static long s = 2;static long x = 6666;public static double random() {long t = (x*x)/((long)Math.pow(10,s))%((long)Math.pow(10,2*s));x = t;return t*1.0/((long)Math.pow(10,2*s));}public static void main(String[] args) {for(int i = 0;i<10;i++)System.out.println(random());}
}

输出

0.4355
0.966
0.3156
0.9603
0.2176
0.7349
0.0078
0.006
0.0036
0.0012

看起来这个算法还行,我们输出一万个数用直方图统计一下看看效果怎么样

统计结果1


额。。。为什么看起来输出的数字全在0.0-0.05这个区间上

把所有数字输出到控制台之后,发现从第11位数字之后,输出的数字就都是0

确实,平分取中法优点是计算简单,但它有许多缺点:首先很难说明取什么样的种子值可保证有足够长的周期;其次容易退化为一常数,甚至退化为零,因为一旦有一个数为零,以后的数都将为零。

平方取中法的成功与否与种子及常数的选取关系很大,一般说来,s值很大时,种子取值也很大,可使退化推迟,周期加长

我们把s设为4,x设为66666666再统计试试看

统计结果2

这下数字分布就比较平均了,这个算法还是有可取之处的

线性同余法

线性同余法亦称“线性同余随机数生成器”,由美国莱默尔在1951年提出,它是很常见的一种随机数生成算法。它的递推公式如下:

其中A,B,M是设定的常数,用线性同余法产生随机数的特点是非常容易实现,生成速度快。线性同余法的最大周期是M,要使周期达到最大,要满足以下条件:

下面我们看看线性同余法的效果

public class Random{  static int A = 97;static int B = 3;static int M = 10001;static int N = 71;public static double random() {return (N = (N*A+B)%M)*1.0/M;}public static void main(String[] args) {for(int i = 0;i<10;i++)System.out.println(random());}
}

输出

0.688931106889311
0.8266173382661733
0.18218178182181782
0.6719328067193281
0.1777822217778222
0.24517548245175483
0.7823217678232177
0.8855114488551145
0.8949105089491051
0.8066193380661933

再输出一万个数统计试试

统计结果


效果也很不错
其他的随机数生成方法还有很多,例如XorShift算法通过异或和位移实现 , 每次生成不同的32位, 周期为2的32次方减1,也很简单高效

欢迎关注微信公众号:Java后台开发

致力于分享原创计算机与软件开发知识及SSM、Spring cloud、Redis、微服务等Java后端开发技术
公众号里还有很多开发工具及学习资料

计算机随机数是如何生成的?(平分取中法、线性同余法)相关推荐

  1. 把数字随机分成 php,php随机数 微信随机生成红包金额算法php版

    最近在研究发红包的功能,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分 ...

  2. php随机数字不重复使等式成立_php随机数不重复生成的五种方式

    在前一篇文章中我介绍了php随机数的生成方法,我们都知道php随机数不管是在开发中,还是在移动应用中,都是不可少的一部分,平时日常开发中经常会跟php随机数打交道,那么今天就给大家介绍php随机数不重 ...

  3. 获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行

    编写程序,获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行 题目:编写程序,获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行 ...

  4. 计算机组成原理偶校验编码设计,计算机组成原理校验码生成电路的设计.doc

    计算机组成原理校验码生成电路的设计 编 号:学 号: 9 课 程 设 计 教 学 院计算机学院课程名称计算机组成原理课程设计题 目校验码生成电路的设计专 业计算机科学与技术班 级计科一班姓 名陈建辉同 ...

  5. matlab逆变换法产生随机数_信号处理——生成给定分布随机数

    作者:桂. 时间:2017-03-12  19:31:55 前言 本文是曲线拟合与分布拟合一文的插曲,进行分布拟合时,碰到一个问题是,如何指定分布的随机数呢?本文主要包括: 1)连续型随机数: 2)离 ...

  6. access查询mysql_2017计算机二级Access数据库生成表查询教程

    2017计算机二级Access数据库生成表查询教程 引导语;你知道运用Access数据库如何查询生成表吗,以下是百分网小编分享给大家的2017计算机二级Access数据库生成表查询教程,欢迎阅读! 生 ...

  7. 线性同余法产生随机数C语言,线性同余生成随机数的一点思考

    今天下午 pk 和我讨论了一个问题,他看到在另一个项目组的 lua 代码里有一段使用线性同余产生随机数的代码,但是那个项目组的同事告诉他这个函数生成的随机数是分布不均的.于是他想到了我前两天给他讲的关 ...

  8. 随机数与随机序列生成

    随机数与随机序列生成 随机数的生成 · 通过rand()函数生成随机数 · 通过多个随机数拼接生成随机数 随机序列的生成 · 通过随机全排列生成随机序列 · 通过set集合去重生成随机序列 随机数的生 ...

  9. Java 生成0-100的随机数,直到生成88为止

    public class t12 { //生成0-100的随机数,直到生成88为止     public static void main(String[] args) {         while ...

  10. 随机数产生代码C++(用于程序中生成vector等,很方便)

    在用c++编写或者测试程序的时候,经常会输入vector等,利用随机数产生函数,比较方便 看了一边不错的文章,产生随机数 /C++产生随机数 C++中没有自带的random函数,要实现随机数的生成就需 ...

最新文章

  1. Centos 7 安装Mysql5.7
  2. AI:一个20年程序猿的学习资料大全—人工智能之AI/机器学习/深度学习/计算机视觉/Matlab大赛——只有你不想要的,没有你找不到的
  3. jQuery的Ajax方法
  4. hdu1556(树状数组小地方的解释~~~)
  5. 设计模式:原型模式(Prototype)
  6. python列表逐行写入excel_python表格数据到excel-想问下python3怎么将列表数据逐行写入excel表格呢?...
  7. linux获取连续数组下标值,shell 数组,双层循环打印变量
  8. 定了!特斯拉宣布股东大会和“电池日”活动9月22日举行
  9. 实验一 结构化分析(软件工程)
  10. [Bada开发]使用静态库
  11. 科普 [分子力学总势能(或者LJ势能)能量最小化]
  12. 【Week 1】Preferences and Ratings
  13. 网页怎么预先加载模型_修补预先训练的语言模型
  14. java读书雷_Java多态学习笔记
  15. 8个常见的研究者认知偏误陷阱(转载)
  16. 猴子选大王(python)
  17. 全栈学习日记001--穿过黑色12月,在2021年第二周的开始见到曙光,朝着光一直走下去吧
  18. 基于Hi3559A ARM64位嵌入式平台的OpenCV2.4.9+ffmpeg2.0.7移植及应用
  19. android删除所有已保存wifi密码,安卓移除/忘记已保存的wifi密码
  20. 【图像配准】基于灰度的模板匹配算法(三):划分强度一致法(PIU)

热门文章

  1. kindle paperwhite3 拆机越狱
  2. VS2015卸载。非常干净-亲测有用
  3. 熵权法 算权重系数 python
  4. XSS漏洞扫描器(2种方法)
  5. (附源码)springboot自律健身房会员管理系统 毕业设计456466
  6. 深入浅出 NXLog (一)
  7. MTK各个分区功能大全
  8. 基于stm32的指纹打卡系统/指纹锁
  9. [C++] [FLTK] 很久以前写的FLTK计算器
  10. 计算机cpu操作ppt,CPU基础知识PPT课件