`
k_lb
  • 浏览: 798495 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

JAVA语言随机数的产生及其应用

 
阅读更多

JAVA语言随机数的产生及其应用

【摘要】
随机数在现代密码学领域有着极其广泛地应用。在密码学中,对一个序列的随机性是这样定义的:看起来是随机的,即能通过我们所能找到的所有正确的随机性检验。这个序列是不可预测的,也就是说,即使给出产生序列的算法或者硬件设计和以前产生序列的所有知识,也不可能通过计算来预测下一个比特是什么。这个序列不能重复产生,即使在完全相同的操作条件下用完全相同的输入对序列发生器操作两次,也将得到两个完全不同的、毫不相关的位序列。
【全文】

随机数在现代密码学领域有着极其广泛地应用。在密码学中,对一个序列的随机性是这样定义的:看起来是随机的,即能通过我们所能找到的所有正确的随机性检验。这个序列是不可预测的,也就是说,即使给出产生序列的算法或者硬件设计和以前产生序列的所有知识,也不可能通过计算来预测下一个比特是什么。这个序列不能重复产生,即使在完全相同的操作条件下用完全相同的输入对序列发生器操作两次,也将得到两个完全不同的、毫不相关的位序列。

随机数产生方法一般有三种。方法1——手工法,如采用抽签、掷骰子、摇号或从搅乱的袋中取出带数字的球等方法,当今的福利彩票就采用该方法;方法2——物理方法,在计算机上安装一台物理随机数发生器,把具有随机性质的物理过程变换为随机数,如附加一个某种放射粒子的放射源,用计数器记录下某段时间内放射出的粒子数,得到真正的随机数;方法3——数学方法,高级编程语言一般用此法生成随机数。

在计算机上用数学方法产生某一分布的随机数,由于是依照某种算法产生的,就不可能是真正的随机数(即不满足定义条件,因此常把数学方法产生的随机数称为伪随机数。只要伪随机数具有真正随机数的一些统计性质,就可以把伪随机数作为真正随机数来使用。

JAVA语言随机数产生原理

JAVA语言是采用数学方法——线性同余法(Liner Congruence Generator,即LCG法)产生随机数的。有整数abMM为模并M > 0,若b - aM的倍数。则有ab分别除以M后,所得余数相同。则称ab关于模M同余,记为:ab (modM)

例如:111 (mod10)111 (mod10)1260 (mod16)

LCG方法的一般递推公式为:

Xn = (a *(Xn -1)+ c) % M

Rn = Xn/ M

初值X0  (n = 1 ,2 , &S943;&S943;)

其中M为模数,a为乘子(乘数)c为增量(加数),且Xn ,Mac均为非负整数。

由上式得到的Xn (n = 1 ,2 , &S943;&S943;)满足:0 ≤Xn < M,从而Rn[0 ,1 ]

应用递推公式产生均匀分布随机数时,式中参数acX0M的选取十分重要。

例如,取M = 10a = c =X0 = 7,得

{Xn} :6 ,9 ,0 ,7 ,6 ,9 ,0 ,7 &S943;&S943;周期为4

例如,取M=16a=5c=3X0=7,得

{Xn} :6 ,1 ,8 ,11 ,10 ,5 ,12 ,15 ,14 ,9 ,0 ,3 ,2 ,13 ,4 ,7 ,6 ,1 &S943;&S943;周期为16

例如,M = 8a = 5c = 1X0 = 1,得

{Xn} :6 ,7 ,4 ,2 ,3 ,0 ,1 ,6 ,7 &S943;&S943;周期为8

LCG方法产生的随机数在周期内不会重复。

线性同余法产生的伪随机数具有随机性好、周期长,易于计算机实现和速度快等特点而被广泛采用。但用线性同余法产生的随机数因受到数学规律的影响而具有周期性和相关性。

Java语言通过java.util.Random类产生一个随机数发生器。它有两种形式的构造函数,分别是Random()Random(long seed)。随机数发生器即Random对象产生以后,可以通过对象调用不同的函数:nextInt()nextLong()nextFloat()nextDouble()等来获得不同类型的随机数。

某范围内可重复和不可重复随机数的产生方法

在实际随机产生及应用过程中,根据整数随机数范围性和是否可重复性,可分为某范围内可重复和某范围内不可重复。

1)生成10个在区间[100300]内可重复的随机数:

import java.util.*;

class RandomTest {

public static void main(String[] args) {

int lowerbound = 100;

int upperbound = 300;

Random random1 = new Random();

for (int i=1;i<=10;i++){

int rndnumber = random1.nextInt(upperbound-lowerbound+1) + lowerbound;

System.out.println(""+i+"个随机数:"+rndnumber);

}

}

}

2)生成10个在区间[100300]内不可重复的随机数:

import java.util.*;

class RandomTest {

public static void main(String[] args) {

int lowerbound = 100;

int upperbound = 300;

int lastindex=upperbound-lowerbound+1;

int rndavailable[] = new int[lastindex];

Random random1 = new Random();

for (int i=lowerbound;i<=upperbound;i++){

rndavailable[i-lowerbound]=i;

for (int i=1;i<=10;i++){

int rndindex=random1.nextInt(lastindex);

System.out.println(""+i+"个随机数:"+rndavailable[rndindex]);

rndavailable[rndindex]=rndavailable[lastindex-1];

lastindex--;

}

}

}

}

产生一定范围内不可重复的随机数,不能按通常的思路:把曾经生成的随机数保存起来作为历史数据。产生一个新的随机数后在历史数据中搜索,若找到就重新产生一个新的再重复数据搜索;否则就认为已经找到了一个新的不同随机数。

从数学的角度来说,概率上存在每次产生的随机数都相同的可能性,尽管这种可能性很小。换言之,按上述思路编制的程序在运行过程中可能会导致死循环!从算法的角度来讲,在理论上,程序失去了有穷性、有效性和确定性。

正因为如此,上述程序代码把要产生的所有数放到一个数组rndavailable,每次随机生成数组rndavailable的一个下标rndindex,然后取出它所对应的数据,将数组rndavailable的最后一个数放到下标rndindex的位置,同时将数组rndavailable的长度减1。这样每一次生成的随机数都不会一样,从而保证了算法的确定性、有效性和有穷性。

JAVA随机数发生器产生的是伪随机数,是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。Random()使用当前时间即System.currentTimeMillis()作为发生器的种子,由于每次调用时的时间不同,所以产生的随机数序列也不同。在产生某范围内不可重复的随机数应用中,要充分考虑算法确定性、有效性和有穷性。

真正的随机数是不可能通过具体的算法生成的,只能来源于随机事件。如何利用计算机中的随机事件快捷产生真正的随机数一直是计算机研究人员探索的热点课题


分享到:
评论

相关推荐

    计算机程序设计(Java)-教案--单元二--Java语言开发基础.docx.docx

    课程名称 Java程序设计 教师姓名 专业班级 授课时间 授课地点 学时数 8 授课题目 §2Java语言开发基础 教学目标及要求 知识目标 掌握Java语言的基本组成; :・掌握数据类型、变量、运算符及表达式; :・掌握三种...

    Java贪吃蛇游戏实训(源代码+可运行Jar包+实训报告)

    Java语言是一种跨平台,适应于分布式计算环境的面向对象编程语言,用Java编写的应用程序可以不经过大幅度修改就可在不同的软硬件平台上运行,更加简便高效。本项目是设计《贪吃蛇》小游戏的Java程序,当游戏开始时...

    JAVA_API1.6文档(中文)

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    数据结构与算法分析_Java语言描述(第2版)]

    树4.1 预备知识4.1.1 树的实现4.1.2 树的遍历及应用4.2 二叉树4.2.1 实现4.2.2 例子:表达式树4.3 查找树ADT——二叉查找树4.3.1 contains方法4.3.2 findMin方法和findMax方法4.3.3 insert方法4.3.4 remove方法...

    (超赞)JAVA精华之--深入JAVA API

    2.1.6 JMX的当前实现及应用 2.1.7 小结 2.2 应用 JMX 最佳实践 2.3 Java/J2EE中文问题终极解决之道 2.4 Java Web应用中的任务调度 2.5 用连接池提高Servlet访问数据库的效率 2.6 应用服务器的集群策略及Java EE 5.0 ...

    数据结构与算法分析Java语言描述(第二版)

    树4.1 预备知识4.1.1 树的实现4.1.2 树的遍历及应用4.2 二叉树4.2.1 实现4.2.2 例子:表达式树4.3 查找树ADT——二叉查找树4.3.1 contains方法4.3.2 findMin方法和findMax方法4.3.3 insert方法4.3.4 remove方法...

    Java 1.6 API 中文 New

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    《Java和Android开发实战详解》第2到5章源代码-by 南邮-陈杨

    1.2.2 Java语言的版本 6 1.2.3 Java编程语言的特点 8 1.3 Java语言的开发环境 8 1.4 搭建Java开发环境 9 1.4.1 安装与设置JDK 9 1.4.2 安装与启动Eclipse IDE 12 习题 15 第2章 构建Java应用程序 16...

    java api最新7.0

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    数据结构与算法分析 Java语言描述第2版

    树4.1 预备知识4.1.1 树的实现4.1.2 树的遍历及应用4.2 二叉树4.2.1 实现4.2.2 例子:表达式树4.3 查找树ADT——二叉查找树4.3.1 contains方法4.3.2 findMin方法和findMax方法4.3.3 insert方法4.3.4 remove方法...

    JavaAPI1.6中文chm文档 part1

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    Java 2平台安全技术-结构,API设计和实现

    第2章 Java语言的基本安全特点 12 2.1 Java语言和平台 12 2.2 基本安全结构 13 2.3 字节代码验证和类型安全 14 2.4 签名应用小程序 15 2.5 关于安全错误及其修复的简要历史 16 第3章 JDK1.2安全结构 19 3.1 起源 19 ...

    JAVA SE学习精华集锦

    2.1.6 JMX的当前实现及应用 91 2.1.7 小结 91 2.2 应用 JMX 最佳实践 91 2.3 Java/J2EE中文问题终极解决之道 95 2.4 Java Web应用中的任务调度 96 2.5 用连接池提高Servlet访问数据库的效率 99 2.6 应用服务器的集群...

    数据结构与算法分析_Java语言描述(第2版)

    4.1.2 树的遍历及应用 4.2 二叉树 4.2.1 实现 4.2.2 例子:表达式树 4.3 查找树ADT——二叉查找树 4.3.1 contains方法 4.3.2 findMin方法和findMax方法 4.3.3 insert方法 4.3.4 remove方法 4.3.5 平均情况分析 4.4...

    JAVA 2平台安全技术-结构,API设计和实现

    第2章 Java语言的基本安全特点 12 2.1 Java语言和平台 12 2.2 基本安全结构 13 2.3 字节代码验证和类型安全 14 2.4 签名应用小程序 15 2.5 关于安全错误及其修复的简要历史 16 第3章 JDK1.2安全结构 19 3.1 起源 19 ...

    黑龙江大学面向对象程序设计Java实验讲义软件样本.doc

    Java语言程序设计 实验讲义 黑龙江大学计算机科学技术学院 3月 前 言 《Java语言程序设计实验》在面向对象程序设计基本上,阐述Java语言编程基本及其设 计办法。内容涉及:Java程序输入输出、表达式与运算符、构造化...

    实验项目D、Java应用专题编程

    2、掌握包装类及自动装箱拆箱机制。 3、掌握异常的使用。 4、掌握包的使用。 5、理解内部类、泛型、反射和注解等专题技术。 ★专题:常用类和接口★ 1、初步掌握字符串类的常用方法。 2、初步掌握日期和日期格式类...

    JavaAPI中文chm文档 part2

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    java课程设计指导书.doc

    java课程设计指导书 课程设计指导书 前言 ... 实现日期与星期的查询 6 、猜数字游戏 要求:计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直至 猜到,给出所用时间和评语。 要求提交Application

Global site tag (gtag.js) - Google Analytics