java学习-java.lang.Math随机数生成
java中的随机数,java.lang.Math.random()和java.util.Random.nextDouble()
Math.random()方法是生成0.0---1.0区域内的随机数,每次返回的数值都是不一样,应该可以算作随机数,
而Random类,如果初始化时候new Random(12).nextDouble()是这样设置的int seed 这个值一直是12,那么,不论循环多少次,多长时间间隔,
生成的第一个随机数即第一次调用nextDouble()方法返回的结果都是一样的。这个是因为,这个生成的随机数是通过 12这个seed为参数,调用特定算法生成了,所以不论怎样,生成的数值都是一样,这个算伪随机数
Math.random()方法内部其实也是调用的Random类的nextDouble()方法。只不过其调用的是无参的构造方法
/**
* Creates a new random number generator. This constructor sets
* the seed of the random number generator to a value very likely
* to be distinct from any other invocation of this constructor.
*/
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
这个方法会调用时间戳还有原子seeduniquifier()方法进行seed参数的初始化,所以Math.random()方法每次生成的数据都是不一样的
根据网上说法:发现java中的随机方法是相对意义上的真随机数,也就是伪随机数。
Random类构造方法带固定参数,
黑客可以通过生成的随机序列反推出这个随机种子,也就是seed参数的值,从而预测出下一个产生的随机序列数
如下面,生成1到100的随机数,并统计1到100随机出现的次数。
public class RandomTest {
static Random random = new Random(10);
public static void main(String[] args) {
int[] count = new int[100];
for (int i = 0; i < 100000; i++) {
//System.out.println(Math.random() * 10 + "工具类:" + random.nextInt(5));
int number = random.nextInt(100) + 1;
//System.out.println("生成随机数为:"+number);
count[number - 1]++;
}
for (int i = 0; i < 100; i++) {
System.out.println("数字" + i + 1 + ":" + count[i]);
}
}
}
重复执行多次各个数据出现的次数都是一样了。下面是返回的结果,两次返回的结果是一样的
数字86:992
数字87:996
数字88:998
数字89:1037
数字90:899
数字91:987
数字92:988
数字93:978
数字94:981
数字95:1001
数字96:985
数字97:1019
数字98:1018
数字99:930
数字100:962
所以使用随机数的时候最好默认使用空的构造方法,就可以防止数据出现次数相同
new Random();
java学习-java.lang.Math随机数生成的更多相关文章
- [Java学习] Java虚拟机(JVM)以及跨平台原理
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...
- java学习-java.lang一Number类
java.lang包是java语言中被用于编程的基本包.编写的程序基本上都要用到这个包内的常用类. 包含了基本数据类型包装类(Boolean,Number,Character,Void)以及常用类型类 ...
- java学习——java中的反射学习笔记
Java--reflect 一.Class类的使用 什么是Class类? 1:在面向对象的世界中,万事万物皆对象. java语言中,静态的成员,普通数据类型类是不是对象呢? 是,对象!是类的对象! 类 ...
- 【转】Java学习---Java Web基础面试题整理
[原文]https://www.toutiao.com/i6592359948632457731/ 1.什么是Servlet? 可以从两个方面去看Servlet: a.API:有一个接口servlet ...
- 【转】Java学习---Java中volatile关键字实现原理
[原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.c ...
- [Java学习] Java Object类
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: 1 ...
- [Java学习] Java字符串(String)
从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串: String stringName = ...
- Java学习----Java概述
一.常用DOS命令 d: 盘符切换 dir(directory) 列出当前目录下的文件以及文件夹 md (make directory) 创建目录 rd (remove director ...
- JAVA学习-JAVA环境准备
dir:列出当前目录下的文件以及文件夹md: 创建目录rd: 删除目录cd: 进入指定的目录,打开文件夹cd..:退回到上一级目录cd/或cd\:退回到根目录del:删除文件d: : 切换到D盘根 ...
随机推荐
- Hdu3363 Ice-sugar Gourd 2017-01-16 11:39 43人阅读 评论(0) 收藏
Ice-sugar Gourd Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 移动 APP 网络优化概述
一般开发一个 APP,会直接调用系统提供的网络请求接口去服务端请求数据,再针对返回的数据进行一些处理,或者使用AFNetworking/OKHttp这样的网络库,管理好请求线程和队列,再自动做一些数据 ...
- 图片捕获工具driftnet
driftnet是一款简单而使用的图片捕获工具,可以很方便的在网络数据包中抓取图片.该工具可以实时和离线捕获指定数据包中是图片,当然在kali里是有的. 在我之前的一篇博文<kali下搭建WiF ...
- html.EditorForModel自定义模版
https://www.cnblogs.com/lori/p/5969658.html http://www.cnblogs.com/yinzixin/archive/2012/12/18/2821 ...
- 【TypeScript】TypeScript 学习 5——方法
在 JavaScript 中,有两种方式定义方法. 1.命名的方法 function add(x,y){ return x+y; } 2.匿名方法 var myAdd = function(x,y) ...
- EasyUI 让dialog中的treegrid的列头固定
先上效果: 最主要是在treegrid要加上"fit:true "如果不加那么就会用diglog的滚动条,导致treegrid的头就没办法固定. Code<div id=&q ...
- Android 如何修改gen下包的名字
前言 当将项目中包进行重命名后,所有包名字修改了,但是在gen目录下android sdk 自动生成的包名并没有修改,如果要引用R.java 中的字段, 又得import以前的包名字. 原因 出现 ...
- DBCC--CHECKDB--不可被替代的原因
CHECKSUM不能发现的两类问题 1. 发生在内存中的页错误,如内存损坏+第三方程序修改等 2. MS SQL Server潜在BUG导致的逻辑错误,该类错误可以使用重建索引或重建约束来修复 CHE ...
- (zxing.net)一维码MSI的简介、实现与解码
一.简介 MSI/Plessey 条码(也被称为 MSI 或 Modified Plessey)是一款数字条码,多用于超市.存储用的仓库和其他贮藏室的货架.货架上的条码可以告知货架上的产品.应放数量和 ...
- Java的动态编译、动态加载、字节码操作
想起来之前做的一个项目:那时候是把需要的源代码通过文件流输出到一个.java文件里,然后调用sun的Comipler接口动态编译成.class文件,然后再用专门写的一个class loader加载这个 ...