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盘根 ...
随机推荐
- 【OSGI】1.初识OSGI-到底什么是OSGI
目前,业内关于OSGI技术的学习资源或者技术文档还是很少的.我在某宝网搜索了一下“OSGI”的书籍,结果倒是有,但是种类少的可怜,而且几乎没有人购买. 因为工作的原因我需要学习OSGI,所以我不得不想 ...
- oracle 游标实现多重循环
declare -- Local variables here i integer; cursor c_province is select ds.swjg_dm from dm_swjg ds wh ...
- Ubuntu/Debian下通过Apt-get简单安装Oracle JDK
近几年本人对各种Arm小板,开发板不明原因中毒,基本以Linux系统为主,本篇文章以记录在32位Arm的Debian8上,通过Apt-get的简单命令安装Oracle JDK8并成功的记录. 1.首先 ...
- SQL Server OS 调度
--SQL SERVER OS 采用合作模式的线程调度模式,即除非Worker主动放弃CPU,否则SQL OS 不会强制剥夺其CPU,从而减少Context Switch --默认设置下,SQL SE ...
- .Net core,EFCore 入门
我在百度上搜了一下.net core和efcore 入门案例.好多博客都是大概说了一下做法,对于小白而言还是一头雾水,我今天就抽出一点时间,写一个详细的入门小案例,就一张表没有什么业务可言.主要是操 ...
- Visual Studio Code 学习.net core初体验
一,安装 最近在用 Visual Studio Code 学习.net core ,记录下学习的过程,首先去官网下载最新的.net core2.1安装包,有windows 和mac,根据自己的开发环境 ...
- mvc基础知识(1)
复制大佬的,侵权请联系我主动删除 1.js/css合并 在之前的crud例子中,我们引入js/css脚本的方式和平常的web开发一样 <script src="~/Scripts/jq ...
- 【ZOJ2314】Reactor Cooling(有上下界的网络流)
前言 话说有上下界的网络流好像全机房就我一个人会手动滑稽,当然这是不可能的 Solution 其实这道题目就是一道板子题,主要讲解一下怎么做无源无汇的上下界最大流: 算法步骤 1.将每条边转换成0~u ...
- flume在windows环境下的使用
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理, ...
- linux ab压力测试工具及ab命令详解
原文链接:https://blog.csdn.net/qq_27517377/article/details/78794409 yum -y install httpd-tools ab -v 查看a ...