“真随机”与“伪随机”

  • 真随机:就是我们传统意义上理解的“随机”,随机事件如今天是否下雨,抛硬币的正反面,家门口的十字路口今天发生车祸等等。这些看似毫无规律而言的事件发生的概率是“随机的”。所谓的“真随机”,是完全杂乱的,不存在统计学参杂的,具有不可预测性和不可重现性。
  • 伪随机:观点在于“万物皆有起因”,就像福尔摩斯所说的,如果将世界一切物质都能量化成“参数”,那么“一切都可以预测”,就好象“今天会不会下雨”这样的随机事件其实也是气候状态所决定的,是有原因的。计算机上的“伪随机”也是如此,想让机器真的给你生成一个**概率上“随机的”**随机数是仍然没办法实现的。因此“伪随机”的“伪”指的是计算机产生的伪随机数既是随机的(不是“假随机”)又是有规律的。

“伪随机数”与“随机种子”

有限状态机不能产生真正的随机数的,所以,现代计算机中,无法通过一个纯算法来生成真正的随机数,无论是哪种编程语言,单纯的算法生成的数字都是伪随机数,都是由可确定的函数通过一个种子,通过比较复杂的计算方法产生的伪随机数。而这个种子,就是我们说的**“随机种子”**。

可以这么理解:如果将生成的“伪随机数”看作是程序的输出的话,那么输入就是“随机种子”,而程序本身就是“随机函数”,如下图所示:

每次调用随机函数,随机函数都会按顺序生成随机数序列中的“伪随机数”,实际上,对于每一个特定的随机种子,随机数序列都是固定的。

Java的随机数生成器

Java提供了几种随机数生成器,如Ramdom类、SecureRandom类等。

伪随机生成器:
随机函数可以称作是“伪随机数发生器”,它采用特定的算法,将随机种子seed转换成一系列的伪随机数,构成一个伪随机数序列,因此伪随机数依赖于seed的值。伪随机数的生成过程只依赖CPU,不依赖任何外部设备,生成速度快,不会阻塞。

Random类的使用:

public class randomNum {long seed = 1;Random r = new Random(seed);public void setSeed(long s){r.setSeed(s);seed = s;}public void random(){System.out.println("generate 5 random number by seed:"+seed);for(int i = 0; i < 5; ++i){System.out.println(r.nextInt());}}public static void main(String []args) {randomNum rn=new randomNum();rn.random();rn.setSeed(5);rn.random();}
}

如果使用Random构造函数时不提供参数,系统会默认使用当前的时间作为seed。(Ramdom类里面next方法可以读一读,挺有趣的)
运行结果:

generate 5 random number by seed:1
-1155869325
431529176
1761283695
1749940626
892128508
generate 5 random number by seed:5
-1157408321
758500184
379066948
-1667228448
2099829013
generate 5 random number by seed:1
-1155869325
431529176
1761283695
1749940626
892128508

代码和结果都很好理解,用同样的seed获得的序列是固定的,不同的seed却有不同的随机数数列,很好的阐述了什么叫“伪随机”,既有概率上的随机,又有可预测的共性。

强随机数
所谓的“强随机”,就是随机函数除了依赖算法之外,引入一些随机事件源使得随机函数更加“概率上随机”。

强随机数发生器依赖于操作系统底层提供的随机事件。强随机数生成器的初始化速度和生成速度都较慢,而且由于需要一定的熵累积才能生成足够强度的随机数,所以可能会造成阻塞。熵累积通常来源于多个随机事件源,如敲击键盘的时间间隔,移动鼠标的距离与间隔,特定中断的时间间隔等。所以,只有在需要生成加密性强的随机数据的时候才用它。

Java的强随机数发生器是java.security.SecureRandom类,它使用了synchronize方法保证了线程安全

在linux的实现中,可以使用/dev/random和/dev/urandom作为随机事件源。由于/dev/random是堵塞的,在读取随机数的时候,当熵池值为空的时候会堵塞影响性能,尤其是系统大并发的生成随机数的时候。

真随机数
http://random.org/
从1998年开始提供在线真随机数服务了,它用大气噪音生成真随机数。他也提供了Java工具类,可以拿来使用。地址:
https://sourceforge.net/projects/randomjapi/

如在Linux系统中,SecureRandom的实现借助了/dev/random和/dev/urandom,可以使用硬件噪音生成随机数,尽量地贴近“真随机”。

C的随机数生成器

类似的,使用头文件<stdlib.h>中的srand和rand函数配合生成伪随机数序列。srand用于设置随机种子,rand按顺序生成随机数序列中的伪随机数。

/* This program generates and prints ten random integers between 1 and RAND_MAX*/#include <stdio.h>
#include <stdlib.h>int main()
{usigned int seed;/*申明初始化器的种子,注意是usigned int型的*/int k;pringt("Enter a positive integer seed value: /n");scanf("%u",&seed);srand(seed);printf("Random Numbers are:/n");for(k = 1; k <= 10; k++)printf("%i",rand());printf("/n");return 0;
}

程序用于生成十个用户给定种子的伪随机数。

如何理解“伪随机”以及“随机种子”相关推荐

  1. 【mysql进阶-彩蛋篇】深入理解顺序io和随机io(全网最详细篇)

    MySql系列整体栏目 内容 链接地址 [一]深入理解mysql索引本质 https://blog.csdn.net/zhenghuishengq/article/details/121027025 ...

  2. 自回避随机行走问题 c语言,醉汉随机行走/随机漫步问题(Random Walk Randomized Algorithm Python)...

    世界上有些问题看似是随机的(stochastic),没有规律可循,但很可能是人类还未发现和掌握这类事件的规律,所以说它们是随机发生的. 随机漫步(Random  Walk)是一种解决随机问题的方法,它 ...

  3. 随机森林随机回归预测_使用随机森林预测幸福

    随机森林随机回归预测 Why do we try to predict happiness? Being able to predict happiness means that we are abl ...

  4. 大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2)

              大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out  of  bag  data及代码(2) 上一节中我们讲解了随机森林的基本概念,本节的话我们讲解随机森 ...

  5. Excel随机数字/随机字母/随机日期/随机姓名等常用函数

    Excel随机数字/随机字母/随机日期/随机姓名等常用函数 随机选取选项中字符 随机数字 随机字母 随机日期/时间 随机姓名 温馨提醒 插播一个神奇命令 随机选取选项中字符 =CHOOSE(RANDB ...

  6. python随机种子数_关于随机:rng种子的Python数量

    在用于从种子初始化随机数的文档(python 3.5)中: random.seed(a=None, version=2) Initialize the random number generator. ...

  7. 超简单、超容易理解的随机数字 + 随机字母生成器,传入要生成的随机数的位数即可(大小写字母 + 数字混合)

    代码: import java.util.Random;public class RandomLetterNumUtil {public static String getRandomCode(int ...

  8. 理解I/O:随机和顺序

    转自: http://www.violin-memory.com/blog/understanding-io-random-vs-sequential/ Storage for DBAs: Ever ...

  9. BP反向传播算法的思考和直观理解 -卷积小白的随机世界

    https://www.toutiao.com/a6690831921246634504/ 2019-05-14 18:47:24 本篇文章,本来计划再进一步完善对CNN卷积神经网络的理解,但在对卷积 ...

最新文章

  1. 跨平台代码换行符的问题处理
  2. python3 pymysql 查询结果转字典dict
  3. golang 字符串拼接方式
  4. 微服务和分布式学习专栏
  5. 17 张程序员专属壁纸,有你喜欢的吗?
  6. Intellij IDEA社区版中的SpringBoot入门
  7. SaaS应用出路何在?
  8. JAVASCRIPT加密解密终级指南
  9. Python练手项目之微信机器人、恢复被撤回的微信消息
  10. linux用ping命令测试网速,如何用ping 命令简单测试网速
  11. 初赛模拟试题错题锦集
  12. destoon php 循环语句,destoon二次开发模板及调用语法汇总_PHP
  13. 计算机专业该如何学习:准大一篇
  14. 汉明码纠错java_汉明码(Hamming)编码与纠错原理
  15. 2022 ciscn 东北赛区分区赛 部分 wp
  16. 互联网教育已过时,教育科技才是未来的趋势
  17. python计算协方差_在Python中计算协方差
  18. SuperMap之等高线制作
  19. HTML+CSS简单的淘宝首页框架布局小练(一)
  20. 阿里云分析型数据库MySQL版(AnalyticDB)测试初体验

热门文章

  1. 关于RxJava防抖操作
  2. 选用ASEMI整流桥KBL410要看哪些参数
  3. 对接阿里云车型库接口,Access-Control-Allow-Headers 通过用户流量控制节流
  4. php流媒体播放器下载,window_流媒体下载技术,上网已经4年了,对下载流媒体 - phpStudy...
  5. 面试题-堆和栈的区别
  6. 【LeetCode】957.N天后的牢房
  7. Java项目:基于JAVA的网上订餐外卖系统(计算机毕业设计)
  8. 最全mysql基本使用
  9. 发表了的论文查重率过高怎么解决?
  10. 洛谷 P5424 [USACO19OPEN]Snakes G