伪随机数在Java中的应用研究

时间:2022-08-24 08:45:51

伪随机数在Java中的应用研究

摘要:介绍了Java中伪随机数生成机制,并通过“掷骰子”和“35中7福利”两个游戏模拟程序,着重阐述了伪随机数在Java软件设计中的应用。

关键词:Java;伪随机数;Random类

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)03-628-02

The Research and Application of Pseudo-random Numbers in Java

LI Xiao-ying

(Higher Vocational Technical College, Guilin University of Technology, Nanning 530001, China)

Abstract: This paper introduces the general princle of pseudo-random number generation in java. And the application of Java random number in software design is stressed and described by the two game application program examples of rolliing the dice and welfare lottery.

Key words: java; pseudo-random number; random class

随机数在软件设计领域中得到很广泛的应用。伪随机数是指用数学递推公式所产生的随机数,获取这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。不同的开发环境提供的生成随机数的函数和方法不一样。其中应用得最为广泛、研究最彻底的一个算法即线性同余法。

Java作为一种应用广泛的面向对象的编程开发语言,对随机数生成提供了多种途径,以适应各种不同的设计要求。

1 Java中伪随机数生成机制

1.1 线性同余法

选取足够大的正整数M和任意自然数n0,a,b,由递推公式:

ni+1=(af(n)+b)modMi=0,1,…,M-1 (1)

生成的数值序列称为是同余序列。当函数f(n)为线性函数时,即得到线性同余序列:

ni+1=(a*ni+b)modMi=0,1,…,M-1(2)

以下是线性同余法生成伪随机数的伪代码:

Random(n,m,seed,a,b)

{r0=seed;

for(i=1;i

ri= (a* ri-1+ b)mod m)

其中种子参数seed可以任意选择,常常将它设为计算机当前的日期或者时间;m是一个较大数,可以把它取为2W,W是计算机的字长;a可以是0.01W 和0.99W 之间的任何整数。

1.2 Java的Random类

Java中提供Random类产生伪随机数。Random类使用48位的种子,使用线性同余公式对其进行修改[1-2]。一旦用一个初值创建Random对象,就可以得到一系列的随机数。

在Random类中,Java设计者使用Random()构造方法来初始化Random对象。

Random randomGenerator=new Random();

Random()使用当前的系统时间即System.currentTimeMillis()作为发生器的种子。随机数发生器即Random对象产生以后,可以通过对象调用不同的函数:nextInt()、nextLong()、nextFloat()、nextDouble()等来获得不同类型的随机数。

int randomNumber= randomGenerator.nextInt(n);

其中用到了Random类的nextInt方法。通过nextInt方法产生的随机数的范围应根据特定应用程序需要的不同而不同。当给nextInt方法传递参数n时,由nextInt方法所返回的值的范围为0到n减1。

2 应用分析

2.1 掷骰子游戏

1) 问题分析

掷骰子游戏中,游戏者将滚动两个骰子。每一个骰子有六个面,分别代表1,2,3,4,5,6这六个点。当骰子停下以后,得到两个随机产生的数,计算这两个骰子上面的点数和,根据此点数和判断玩家是否输赢。

2) 类定义

根据问题分析,为该应用程序创建骰子类Dice与测试类TestDice,类关系图如图2。

为了能在掷骰子游戏应用程序中使用随机数,需要导入java.util包的Random类。Dice类定义属性骰子点数point,以及滚动骰子rollDice和显示骰子displayDice两个方法。其中,rollDice方法用于滚动骰子;displayDice用于显示骰子的图片。TestDice类定义rule方法,可用于判断玩家是否输赢。

3) 类实现与GUI设计

Dice类中rollDice方法关键代码如下:

public int rollDice()

{point = rand.nextInt(6)+1;

return point;}

该方法生成1~6(包括边界值)之间的一个int型随机数,作为当前骰子点数。

displayDie方法用于显示对应于1~6之间的骰子图片,其中第1个参数代表所显示图片的JLabel,第2个参数代表骰子的点数值。

public void displayDice(JLabel picDiceJLabel,int face)

{image = new ImageIcon

(FILE_PREFIX+face+FILE_SUFFIX);

picDiceJLabel.setIcon(image);}

其中,FILE_PREFIX和FILE_SUFFIX是两个已得到声明的常量,均定义为private final String型,其值分别为图片文件夹路径和图片后缀。这样,字符串FILE_PREFIX+face+FILE_SUFFIX可用来指明骰子点数对应的图片文件位置。

该应用程序的GUI运行界面如图3所示。

2.2 35中7福利游戏

1) 问题分析

35中7福利游戏中,中奖号码由7个基本号码组成,使用指定的专用摇奖器摇出。摇奖器内放置标有01-35的35个号码球,摇奖时依次摇出7个号码球,然后,依据设置相应的兑奖规则,(如7中7、7中6、7中5)等,进行兑奖。

2) 类定义

根据问题分析,为该应用程序创建球类Bull、游戏类Game与测试类TestGame,类关系图如图4。

同样,为了能在游戏应用程序中使用随机数,需要导入java.util包的Random类。Bull类定义球号码point以及显示球displayBull方法。其中, displayBull用于显示球号码对应的图片。Game类中playGame方法用于随机从35个球中“摇出”7个球,并需要考虑球号不能重复;ruleGame方法用于设置兑奖规则。

3) 类实现

Game类中playGame方法的关键代码如下:

public void playGame()

{int i=0;

上一篇:基于CAN与无线射频技术的煤矿监控系统设计 下一篇:面向应用Intranet流量监测系统的设计与实现