【摘要】
随机数在现代密码学领域有着极其广泛地应用。在密码学中,对一个序列的随机性是这样定义的:①看起来是随机的,即能通过我们所能找到的所有正确的随机性检验。②这个序列是不可预测的,也就是说,即使给出产生序列的算法或者硬件设计和以前产生序列的所有知识,也不可能通过计算来预测下一个比特是什么。③这个序列不能重复产生,即使在完全相同的操作条件下用完全相同的输入对序列发生器操作两次,也将得到两个完全不同的、毫不相关的位序列。
【全文】
随机数在现代密码学领域有着极其广泛地应用。在密码学中,对一个序列的随机性是这样定义的:①看起来是随机的,即能通过我们所能找到的所有正确的随机性检验。②这个序列是不可预测的,也就是说,即使给出产生序列的算法或者硬件设计和以前产生序列的所有知识,也不可能通过计算来预测下一个比特是什么。③这个序列不能重复产生,即使在完全相同的操作条件下用完全相同的输入对序列发生器操作两次,也将得到两个完全不同的、毫不相关的位序列。
随机数产生方法一般有三种。方法1——手工法,如采用抽签、掷骰子、摇号或从搅乱的袋中取出带数字的球等方法,当今的福利彩票就采用该方法;方法2——物理方法,在计算机上安装一台物理随机数发生器,把具有随机性质的物理过程变换为随机数,如附加一个某种放射粒子的放射源,用计数器记录下某段时间内放射出的粒子数,得到真正的随机数;方法3——数学方法,高级编程语言一般用此法生成随机数。
在计算机上用数学方法产生某一分布的随机数,由于是依照某种算法产生的,就不可能是真正的随机数(即不满足定义条件③),因此常把数学方法产生的随机数称为伪随机数。只要伪随机数具有真正随机数的一些统计性质,就可以把伪随机数作为真正随机数来使用。
JAVA语言随机数产生原理
JAVA语言是采用数学方法——线性同余法(Liner Congruence Generator,即LCG法)产生随机数的。有整数a,b,M;M 为模并M > 0,若b - a为M 的倍数。则有a,b 分别除以M后,所得余数相同。则称a 与b 关于模M 同余,记为:a≡b (modM)。
例如:11 ≡1 (mod10);1 ≡11 (mod10);12 ≡60 (mod16)
LCG方法的一般递推公式为:
Xn = (aXn - 1 + c) (modM)
Rn = Xn/ M
初值X0 (n = 1 ,2 , &S943;&S943;)
其中M为模数,a为乘子(乘数) ,c为增量(加数),且Xn ,M,a,c均为非负整数。
由上式得到的Xn (n = 1 ,2 , &S943;&S943;) 满足:0 ≤Xn < M,从而Rn ∈[0 ,1 ] 。
应用递推公式产生均匀分布随机数时,式中参数a,c,X0,M的选取十分重要。
例如,取M = 10,a = c = X0 = 7,得
{Xn} :6 ,9 ,0 ,7 ,6 ,9 ,0 ,7 &S943;&S943;周期为4。
例如,取M=16,a=5,c=3,X0=7,得
{Xn} :6 ,1 ,8 ,11 ,10 ,5 ,12 ,15 ,14 ,9 ,0 ,3 ,2 ,13 ,4 ,7 ,6 ,1 &S943;&S943;周期为16。
例如,取M = 8,a = 5,c = 1,X0 = 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个在区间[100,300]内可重复的随机数:
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个在区间[100,300]内不可重复的随机数:
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语言来实现公平且不可预测的随机数生成,确保抽奖结果的公正性。以下将详细介绍Java中的随机数生成及其在抽奖算法中的应用。 首先,Java提供了`java.util.Random`类用于生成随机数。该类...
在Java编程语言中,生成随机数是一项常见的任务,可以用于各种场景,比如模拟随机事件、游戏编程、测试等。Java提供了多种方式来生成随机数,其中最常用的是`java.util.Random`类。在这个主题中,我们将深入探讨如何...
Java语言提供了多种方式来生成随机数,满足不同场景的需求。本文将深入探讨Java中随机数的生成机制,包括使用`System.currentTimeMillis()`、`Math.random()`以及`java.util.Random`类。 #### Java随机数的产生方式...
Java 语言产生泊松分布 Java 语言产生泊松分布是随机数生成领域中的重要问题。本文档主要介绍了如何使用 Java 语言产生泊松分布的随机数...实验结果表明,使用 Java 语言产生的泊松分布随机数能够满足实际应用的需求。
在IT行业中,随机数生成是许多算法和应用的基础,如模拟、加密、游戏开发等。在C#编程语言中,生成随机数的过程涉及到System.Random类的使用。本项目"随机数自检-扑克检测"旨在通过一个实际的扑克牌检测案例来验证...
Java代码实现随机生成汉字的方法是指利用Java语言编写的程序来随机生成汉字。该方法可以生成随机的汉字,满足特定的需求。 背景知识 -------- GB 2312-80 是中国国家标准简体中文字符集,全称《信息交换用汉字编码...
### Java语言生成唯一ID的方法 在Java开发过程中,经常需要为数据对象生成唯一的标识符(ID),以便于数据管理、追踪等操作。本文将详细解析一个具体的Java类——`UniqId`,它用于生成唯一ID。该类通过结合当前...
通过完成一个简单的猜数字游戏,学生不仅能够熟悉Eclipse这一流行的集成开发环境(IDE),还能够掌握Java语言的基本语法,包括变量的声明与使用、各种运算符的功能以及顺序、选择和循环等控制结构的应用。 #### 实验...
在Java语言中,`java.util.Random` 是最常用的随机数生成器。Android作为基于Java的平台,自然也支持这个类。`Random` 类提供了生成各种类型随机数的方法,如整数、长整数、浮点数等。例如,生成一个0到100之间的...
### Java语言课程设计知识点解析 #### 一、Java语言课程设计的目的与要求 **知识点1:复习与巩固Java基础知识** Java课程设计的核心目标之一在于帮助学生回顾并深化对Java语言基本概念的理解,如变量、数据类型、...
### Java语言设计基础篇第九章课后习题解析 #### 9.1 题目解析:矩形类实现及应用实例 **题目背景:** 本题要求设计一个`Rectangle`类来表示矩形,该类包含宽度和高度两个属性,并提供计算面积和周长的方法。同时...
对于整数,可以使用`nextInt(b)`,它会返回0到`b-1`之间的随机数,或者`nextInt(a, b)`(Java 8及以上版本),返回`a`到`b-1`之间的随机数。 C++中,我们可以利用`<random>`库。创建一个随机数引擎,如`std::...
### Java语言的科学与艺术(一):斯坦福大学公开课C106A知识点解析 #### 1. 引言 《Java语言的科学与艺术》是斯坦福大学公开课C106A所采用的经典Java入门教材之一,由资深计算机科学家Eric Roberts编写。该课程不仅...
在这个名为“Java语言编的下雪程序及效果.rar”的压缩包中,我们很显然会找到一个用Java实现的模拟下雪场景的程序。这个程序可能是为了展示Java在图形用户界面(GUI)开发中的应用,或者是为了教学目的,让学生理解...
在提供的代码片段中,可以看出是使用Java语言实现的。下面是对这段代码的详细解释及改进版本: ```java import java.util.Random; public class RandomNumberGenerator { public static void main(String[] args)...
在Java编程语言中,我们可以看到两个不同的实验,分别涉及到线程和图形用户界面(GUI)的应用。下面将详细解释这两个实验...这两个实验展示了Java语言在实际应用中的不同方面,包括多线程、日期时间处理以及GUI编程。
生-1~1之间的随机数x作为豆子的横坐标,用同样的方法产生随机数y作为豆子的纵坐标;S3 判断 (x, y) 是否落在单位圆内,即...通过理解和掌握随机数的生成及应用,我们可以更好地理解和解决现实生活中的各种随机现象。
Java使用多线程找出最大随机数是指使用Java语言中的多线程编程来找出在一定范围内生成的随机数中的最大值。该方法可以通过创建多个线程,每个线程都生成一定范围内的随机数,然后通过比较找出最大值。 在Java中,...
Java语言广泛应用于企业级应用、移动应用、网络应用、大数据处理等领域。 ### 关键知识点解析: 1. **Java语言特性**: - **面向对象**:Java是一种面向对象的语言,支持封装、继承和多态。 - **平台独立性**:...