计算机中随机数的生成

本文探讨了计算机如何生成随机数,从简单的模拟到Java中的实现方法,包括Math库的使用、Random类以及利用时间戳作为种子。还分析了Random类的源码,指出x&(1L<<48)-1相当于x对2^48取模,并提到了梅森旋转算法。最后讨论了硬件随机数生成的可能性,以及在特定场景下对真随机数的需求。
摘要由CSDN通过智能技术生成

无论是c,c++,java以及其他的一些高级语言,其自带的库都提供了对于随机数的生成方法。这里将从下面几个方面论述。

一:简单的模拟一下“随机数"的生成

二:java实现随机数的几种方法

三:java生成伪随机数的源码分析


简单的模拟一下“随机数"的生成

我们知道,计算机都是按一定的程序来执行得,如操作系统程序对电脑的一些操作等,可见,计算机并不会真正的凭空产生数。看下面一组数据:

0.466
0.545
0.836
0.275
0.006
0.205
0.976
0.335
0.746
0.665
0.316
0.195
0.686
0.925
0.856
0.855
0.826
0.985
0.596

看起来像是随机生成的一组数据,其实它只是根据下面这段代码生成的:

public class myRandom {
    private double Seed;
	public static void main(String[] args) {
		 myRandom r=  new myRandom(15);
		 for(int i=0;i<999;i++){
			System.out.println(r.Next());
		}
	}
    public  myRandom(int Seed){
          //随机数种子
         this.Seed=Seed;
	}
	public  double  Next(){
		double next=(29*Seed+31)%1000;
		Seed=next;
		return next/1000;
	}

}
初始的时候默认一个随机数种子,即初始值,每次进行一个
(29*Seed+31)%1000
这个方法,即线性同余的方法,每次产生伪随机数的种子为上一次的值,当然第一次为默认。这样看起来似乎可以生成一些随机数。当时知道想一下就会知道,如果某一次取余之后的结果之前已经出现过,那么就会出现一段相似的数据:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值