随机数发生器

真随机数,伪随机数,UUID SecureRandom

空扰寡人 提交于 2019-12-20 10:21:40
1. 什么是真随机数? 真随机数有一个非常基本的特征就是 不可预测性 2.什么是伪随机数 大部分程序和语言中的随机数,确实都只是伪随机。是由可确定的函数(常用线性同余),通过一个种子(常用时钟),产生的。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性)。 在java中存在一个Random类,我们查看其源码就能发现,其就是使用的算法来实现的随机数,算法产生的随机数都不能算真随机数,有其自身的规则。直观来想,计算机就是一种确定的,可预测的的设备:一行行的代码是固定的,一步步的算法是固定的,一个个与非门是固定的。通过这些固定的东西自身产生真随机,当然不可能。 3. 怎么在计算机上得到真随机数 想直接利用算法得到真随机数,这有点难度,但是也不是没有办法的,计算机不能产生随机数,但是现实世界中是有非常多的随机因素的,将这种随机因素引入计算机,就能实现真随机 Unix 内核中的随机数发生器(/dev/random),理论上它能产生真随机。即这个随机数的生成,独立于生成函数,这时我们说这个随机数发生器是非确定的(不可预见的)。 具体来讲,Unix 维护了一个熵池,不断收集非确定性的设备事件,即机器运行环境中产生的硬件噪音,来作为种子。 比如说,时钟,IO 请求的响应时间,特定硬件中断的时间间隔,键盘敲击速度,鼠标位置变化,甚至周围的电磁波等等…

c++随机数生成

*爱你&永不变心* 提交于 2019-12-20 00:30:57
算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。) 我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。 1.rand() 功能:随机数发生器 用法:int rand(void) 所在头文件: stdlib.h rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。 rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。 用户未设定随机数种子时,系统默认的随机数种子为1。 rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。 2.srand()

C++ 学习笔记

核能气质少年 提交于 2019-12-19 22:11:49
rand() 生成随机数,和一个范围的随机数 (有时候结果会不变) rand ( ) //生成一个随机数 rand ( ) % 100 //生成一个0~99的数 范围是0~小于给定的数 srand() 初始化随机数发生器,作为rand()生成随机数的种子。所以在使用的时候要先写一个srand()种下一颗随机数种子,然后在使用rand()这个长大的果树去生成一个随机数,可以说是从rand()这个树上随便摘一个果子。 但通常srand()又是有参数的。我理解这个参数是可以传递int 类型的,但是如果传递1,那么这个种子就是1不变了,那么最后得到的随机数也就可能会出现相同结果,一般的参数是time(0)或者time(NULL), time(0)表示当前时刻的秒数,那么当我们在不同时刻运行程序的时候就可以得到不同的随机数。 # include <ctime> //time(0)在这个头文件里 srand ( time ( 0 ) ) ; //随机数发生器 for ( int i = 0 ; i < 10 ; i ++ ) { cout << rand ( ) << endl ; //打印随机数 } string 使用string 进行输入输出的时候需要包含他的头文件 使用字符串需要先包含头文件 # include <string> string a = "张三" cout << a <<

JAVA随机数

别来无恙 提交于 2019-12-10 17:51:38
每篇一句 稍待秋风凉冷后,高寻白帝问真源。《望岳三首·其二》- 唐代 - 杜甫 获取随机数的方式 经常使用的大概就下面5种 ①Math.random(): 获取随机小数范围:[0.0,1.0) 返回的值是double类型 ②Random类 构造方法:Random() : 建议使用无参构造方法 方法:int nextInt(int n) : 获取 [0,n) 范围的随机整数 ③ThreadLocalRandom (jdk1.7开始出现) 创建对象: static ThreadLocalRandom current() 方法:int nextInt(int a,int b) : 获取 [a,b) 范围的随机整数 ④System.currentTimeMillis(): 获取一个当前时间毫秒数的long型数字。 ⑤UUID类 静态方法:static UUID randomUUID():获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。即获取随机的字符串,该字符串每次获取都不会重复 ___ ①Math.random() 1、在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其乘以一个数,比如25,就能得到一个[0,25)范围内的随机数;Math.round()是四舍五入的意思 //获取一个[min

java的三种随机数生成方式

自古美人都是妖i 提交于 2019-12-05 13:46:59
  随机数的产生在一些代码中很常用,也是我们必须要掌握的。而java中产生随机数的方法主要有三种:     第一种:new Random()     第二种:Math.random()     第三种:currentTimeMillis()   第一种需要借助java.util.Random类来产生一个随机数发生器,也是最常用的一种,构造函数有两个,Random()和Random(long seed)。第一个就是以当前时间为默认种子,第二个是以指定的种子值进行。产生之后,借助不同的语句产生不同类型的数。   种子就是产生随机数的第一次使用值,机制是通过一个函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。以后产生的随机数都与前一个随机数有关。以代码为例。 1 public static void main(String[] args) 2 { 3   Random r = new Random(1); 4   for(int i=0 ; i<5 ; i++) 5   { 6     int ran1 = r.nextInt(100); 7     System.out.println(ran1); 8   } 9 } 在我的编译器下产生的五个数均为85,88,47,13,54,如果采用Random r = new Random()

Tomcat启动时卡在[localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory

孤街浪徒 提交于 2019-12-05 05:33:52
tomcat启动时一直卡在[localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory,通过查找资料发现这个问题和jvm上的熵池策略有关。 1. 熵池 Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。 计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。 系统内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。 2. JVM上的随机数与熵池策略 在apache-tomcat官方文档 How do I make Tomcat startup faster

boost::thread线程管理

≯℡__Kan透↙ 提交于 2019-12-03 14:46:54
6.1. 概述 线程就是,在同一程序同一时间内允许执行不同函数的离散处理队列。 这使得一个长时间去进行某种特殊运算的函数在执行时不阻碍其他的函数变得十分重要。 线程实际上允许同时执行两种函数,而这两个函数不必相互等待。 一旦一个应用程序启动,它仅包含一个默认线程。 此线程执行 main() 函数。 在 main() 中被调用的函数则按这个线程的上下文顺序地执行。 这样的程序称为单线程程序。 反之,那些创建新的线程的程序就是多线程程序。 他们不仅可以在同一时间执行多个函数,而且这在如今多核盛行的时代显得尤为重要。 既然多核允许同时执行多个函数,这就使得对开发人员相应地使用这种处理能力提出了要求。 然而线程一直被用来当并发地执行多个函数,开发人员现在不得不仔细地构建应用来支持这种并发。 多线程编程知识也因此在多核系统时代变得越来越重要。 本章将介绍C++ Boost库 Boost.Thread ,它可以开发独立于平台的多线程应用程序。 6.2. 线程管理 在这个库最重要的一个类就是 boost::thread ,它是在 boost/thread.hpp 里定义的,用来创建一个新线程。下面的示例来说明如何运用它。 #include <boost/thread.hpp> #include <iostream> void wait(int seconds) { boost::this

纯随机数发生器

匿名 (未验证) 提交于 2019-12-03 00:12:02
public class Suijishu      public static void main(String[] args) {       int n=1000;//n是生成随机数的个数     Creat(n);   }   static BigInteger Creat(int n) {//生成随机数     BigInteger result;//生成的随机数     if(n==1) {//生成第一个随机数,由于没有Creat(n-1),所以用Math.random();       result=BigInteger.valueOf((int)Math.random()*100000+1);       System.out.println("第1个随机数是"+result);       return result;     }     else {       BigInteger i=Creat(n-1).multiply(BigInteger.valueOf(16807));       result=i.mod(BigInteger.valueOf(Integer.MAX_VALUE));//随机数等于Creat(n-1)*16807%int.MAX_VALUE       System.out.println("第"+n+"个随机数是"+result)

【C/C++】随机数的生成

匿名 (未验证) 提交于 2019-12-02 23:52:01
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 int main() 5 { 6 srand((unsigned int)time(0));///以系统流逝时间为随机数发生器种子 7 for(int i=0;i<10;i++) 8 { 9 int n=rand()%(50-25)+25; ///产生25-50间的随机整数,rand%(b-a)+a即产生[a,b)范围内的随机整数 10 double d=rand()/(double)RAND_MAX; ///产生0-1的随机小数 11 printf("%d %f\n",n,d); 12 } 13 puts(""); 14 printf("rand()函数可产生随机数的范围:0―%d\n",RAND_MAX); 15 return 0; 16 } 1 #include<random> 2 #include<time.h> 3 #include<bits/stdc++.h> 4 using namespace std; 5 int main() 6 { 7 mt19937 mt_rand(chrono::high_resolution_clock::now().time_since_epoch().count());///随机种子 8 ///或用:mt19937

ASP.net随机数应用实例

匿名 (未验证) 提交于 2019-12-02 23:49:02
原文链接: http://www.cnblogs.com/wj110reg/articles/904006.html 在.net framework中提供了一个专门用来产生随机数的类system.Random,使用这个类时必须导入system命名空间。当然,命名空间system在每个asp.net页面中都是自动导入的,所以我们可以直接使用这个类。   对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来 近似的模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而 言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机 种子一样,那么同一个随机数发生器产生的随机数也会一样。一般地,我们使用同系统时间有关的参数作为随机种子,这也是.net framework中的随机数发生器默认采用的方法。   我们可以使用两种方式初始化一个随机数发生器:   第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:   Random ro = new Random();   第二种方法可以指定一个int型参数作为随机种子:   int