如何理解“伪随机”以及“随机种子”
“真随机”与“伪随机”
- 真随机:就是我们传统意义上理解的“随机”,随机事件如今天是否下雨,抛硬币的正反面,家门口的十字路口今天发生车祸等等。这些看似毫无规律而言的事件发生的概率是“随机的”。所谓的“真随机”,是完全杂乱的,不存在统计学参杂的,具有不可预测性和不可重现性。
- 伪随机:观点在于“万物皆有起因”,就像福尔摩斯所说的,如果将世界一切物质都能量化成“参数”,那么“一切都可以预测”,就好象“今天会不会下雨”这样的随机事件其实也是气候状态所决定的,是有原因的。计算机上的“伪随机”也是如此,想让机器真的给你生成一个**概率上“随机的”**随机数是仍然没办法实现的。因此“伪随机”的“伪”指的是计算机产生的伪随机数既是随机的(不是“假随机”)又是有规律的。
“伪随机数”与“随机种子”
有限状态机不能产生真正的随机数的,所以,现代计算机中,无法通过一个纯算法来生成真正的随机数,无论是哪种编程语言,单纯的算法生成的数字都是伪随机数,都是由可确定的函数通过一个种子,通过比较复杂的计算方法产生的伪随机数。而这个种子,就是我们说的**“随机种子”**。
可以这么理解:如果将生成的“伪随机数”看作是程序的输出的话,那么输入就是“随机种子”,而程序本身就是“随机函数”,如下图所示:
每次调用随机函数,随机函数都会按顺序生成随机数序列中的“伪随机数”,实际上,对于每一个特定的随机种子,随机数序列都是固定的。
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;
}
程序用于生成十个用户给定种子的伪随机数。
如何理解“伪随机”以及“随机种子”相关推荐
- 【mysql进阶-彩蛋篇】深入理解顺序io和随机io(全网最详细篇)
MySql系列整体栏目 内容 链接地址 [一]深入理解mysql索引本质 https://blog.csdn.net/zhenghuishengq/article/details/121027025 ...
- 自回避随机行走问题 c语言,醉汉随机行走/随机漫步问题(Random Walk Randomized Algorithm Python)...
世界上有些问题看似是随机的(stochastic),没有规律可循,但很可能是人类还未发现和掌握这类事件的规律,所以说它们是随机发生的. 随机漫步(Random Walk)是一种解决随机问题的方法,它 ...
- 随机森林随机回归预测_使用随机森林预测幸福
随机森林随机回归预测 Why do we try to predict happiness? Being able to predict happiness means that we are abl ...
- 大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2)
大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2) 上一节中我们讲解了随机森林的基本概念,本节的话我们讲解随机森 ...
- Excel随机数字/随机字母/随机日期/随机姓名等常用函数
Excel随机数字/随机字母/随机日期/随机姓名等常用函数 随机选取选项中字符 随机数字 随机字母 随机日期/时间 随机姓名 温馨提醒 插播一个神奇命令 随机选取选项中字符 =CHOOSE(RANDB ...
- python随机种子数_关于随机:rng种子的Python数量
在用于从种子初始化随机数的文档(python 3.5)中: random.seed(a=None, version=2) Initialize the random number generator. ...
- 超简单、超容易理解的随机数字 + 随机字母生成器,传入要生成的随机数的位数即可(大小写字母 + 数字混合)
代码: import java.util.Random;public class RandomLetterNumUtil {public static String getRandomCode(int ...
- 理解I/O:随机和顺序
转自: http://www.violin-memory.com/blog/understanding-io-random-vs-sequential/ Storage for DBAs: Ever ...
- BP反向传播算法的思考和直观理解 -卷积小白的随机世界
https://www.toutiao.com/a6690831921246634504/ 2019-05-14 18:47:24 本篇文章,本来计划再进一步完善对CNN卷积神经网络的理解,但在对卷积 ...
最新文章
- 跨平台代码换行符的问题处理
- python3 pymysql 查询结果转字典dict
- golang 字符串拼接方式
- 微服务和分布式学习专栏
- 17 张程序员专属壁纸,有你喜欢的吗?
- Intellij IDEA社区版中的SpringBoot入门
- SaaS应用出路何在?
- JAVASCRIPT加密解密终级指南
- Python练手项目之微信机器人、恢复被撤回的微信消息
- linux用ping命令测试网速,如何用ping 命令简单测试网速
- 初赛模拟试题错题锦集
- destoon php 循环语句,destoon二次开发模板及调用语法汇总_PHP
- 计算机专业该如何学习:准大一篇
- 汉明码纠错java_汉明码(Hamming)编码与纠错原理
- 2022 ciscn 东北赛区分区赛 部分 wp
- 互联网教育已过时,教育科技才是未来的趋势
- python计算协方差_在Python中计算协方差
- SuperMap之等高线制作
- HTML+CSS简单的淘宝首页框架布局小练(一)
- 阿里云分析型数据库MySQL版(AnalyticDB)测试初体验
热门文章
- 关于RxJava防抖操作
- 选用ASEMI整流桥KBL410要看哪些参数
- 对接阿里云车型库接口,Access-Control-Allow-Headers 通过用户流量控制节流
- php流媒体播放器下载,window_流媒体下载技术,上网已经4年了,对下载流媒体 - phpStudy...
- 面试题-堆和栈的区别
- 【LeetCode】957.N天后的牢房
- Java项目:基于JAVA的网上订餐外卖系统(计算机毕业设计)
- 最全mysql基本使用
- 发表了的论文查重率过高怎么解决?
- 洛谷 P5424 [USACO19OPEN]Snakes G