硅谷杂志:伪随机数及其在JAVA程序中的应用分析 |
2012-12-24 14:45 作者:王雪燕 来源:硅谷网 HV: 编辑: 【搜索试试】
|
|
【硅谷网12月24日文】据《硅谷》杂志2012年第19期刊文,原始追求随机数列的方法具有效率低、速度慢、存储空间占据量大以及不可重现的缺点,伪随机数列是通过模拟计算机需求以及各种概率的计算来实现的,伪随机数在程序设计和软件开发中得到日益广泛的使用。伪随机数具有其生成的原理和方法,通过对伪随机数生成原理的分析,来探讨其在JAVA程序中的具体应用。
关键词:伪随机数;生成;JAVA程序;应用
在运用蒙特卡罗法解决实际问题的过程中,会用到不同分布的随机向量、随机变量以及随机过程中η的抽样序列,比如{ηn|n=1,2,…}等等,这些数可以称作随机数。常用的随机数有均匀分布的随机数、二维正态分布的随机数以及二项分布的随机数等,其中均匀分布的随机数是最基本和最重要的。随机数在构建大型游戏、随机模型、动画设计、数字水印、计算机仿真、数字图书保护、数据加密以及分形图形技术等方面有重要作用,因此,伪随机数在计算机上的产生方法备受重视。
1随机数以及JAVA程序概述
1)随机数的概念。随机数的条件有两个,一是满足确定概率分布,二是序列任意数值间相互独立,随机数在测试和时间环境模拟中占有重要位置。目前产生随机数的方法有两种,一是用物理方法来产生真正随机数,二是用数学方法来产生有一定统计规律的随机数列,也就是伪随机数。真正随机数是由硬件产生的,各种物理设备和装置是早期生成随机数的来源,但是由于硬件耗资较高、生成数据的速度较慢、空间占据量大以及不可重现等原因,真正随机数的使用价值有限。而伪随机数在使用之前需要接受检验,通过各种计算机函数库就可以获取伪随机数。
2)JAVA程序。JAVA是面向对象的一种程序设计语言,它舍弃了C++语言中多重继承、运算符重载以及一些容易引发错误的指针等特性,继承了面向对象的技术,通过垃圾清理的方式来增加内存空间,还加入了自动装箱、类型安全枚举等语言特性。JAVA程序首先进行源代码和二进制字节码之间的转换,之后再利用虚拟机来执行字节码,这有利于一次编译和到处执行等跨平台特性的实现。JAVA程序的语言是简单的、面向对象的、分布式的、安全的、可移植的以及解释型的,但是JAVA语言也有一定的局限性,需要通过分析伪随机数在JAVA程序中的应用来实现。
2伪随机数生成机制
通过对随机数定义的分析,算法生成的随机数都不是真正随机数,这就说明了算法生成的只能是伪随机数。但是伪随机数也并非是假的随机数,计算机生成的伪随机数既是有规律的又是随机的。
1)伪随机数产生原理。编译器一般都会提供伪随机数的生成器,提供的原因就是以此来保证随机数列产生的均匀性以及精度,比如要求生成1到10之间的伪随机数,但是0和1间有无穷个值,随机数生成器保证了随机数产生的精度。生成器可以对产生的整数进行调用和采用,并将这些整数传给函数,由此来限制数段之间整数的数目。伪随机数生成器可以将种子作为初始的整数传给函数,由此生成的随机数具有较高的普遍性。经过分析可以发现,如果初始种子相同,生成的相关随机数列也相同,随机数生成器产生的数是不可预测的。
2)伪随机数生成方法。平方取中法、线性同余法、斐波那契法、乘同余法、非线性同余法以及混合同余法等都能产生伪随机数。伪随机数可以通过递推公式产生,在初值和递推公式确定以后,就可以得到随机数数列,但这和随机数独立性要求相互矛盾,伪随机数的周期性循环也和真正的随机数有所区别。因此,伪随机数在计算机生成的过程中需要满足以下要求,首先是分布均匀性,即随机数在统一范围内出现的概率相同。其次是统计独立性,即随机数序列产生的相关性愈小愈好,再次是周期长,即在随机数重复之前可以产生不重复的、足够多的随机数。此外,伪随机数还有占用内存少和产生随机数速度快的优点。
3)线性同余法。虽然产生伪随机数的方法有很多,但是线性同余法还是比较常用的,该办法于1951年由Lehmer提出,有递推公式rk=(multiplier*rk-1+increment)%modulus,生成数值的序列称为同余数列,序列中常熟的选择直接关系到随机序列的相关随机性能。适当的选取常熟可以保证伪随机数区间上的均匀性,除此之外,线性同余法还和种子有关。Wile保证线性同余法统计的性质,要提高种子的均匀性,通过进行算法处理的方式来防止整数的溢出,保证伪随机数均匀且不重复。
4)其他生成方法简介。由于过量的真正随机数会占用较大的内存,而真正随机数的产生又是不可重复的,因此有必要掌握周期有限且适合计算机的伪随机数计算方法。首先,平方取中法。该种产生伪随机数的办法是在1946年被诺伊曼提出,它首先要选用一个位数作为种子,在不足二倍位数的情况下可以在前面补0,在此基础上计算结果。平方取中法的周期很短,有时会发生数值不断重复的问题,适用的范围有限。其次,斐波那契法。该种办法也可以称之为黄金分割法,它是找出一段数列的规律,在数列前面加1来得到新的数列,在此基础上发现数列规律并产生伪随机数,实现程序的运算。
3伪随机数在JAVA程序中的实现
JAVA语言是通过线性同余法来产生随机数,具有周期长、随机性好、速度快、应用广泛以及易于实现的优点,但是该法产生的伪随机数也会受到数学规律影响,随机数的相关性和周期性也会受到影响。现在较为常用的是通过Random来产生随机数,通过工具库中java.util.Random来产生各种类型的随机数。
1)Random类的实现。在JDK的最初版本发布之日起,就可以使用java.util.Random类来产生随机数,Random类主要是通过nextInt方法来实现,下面是该方法实现的代码,Randomrandom=newRandom();intnumRandom=random.nextInt(10)。通过nextInt产生的随机数可以根据应用程序的不同而进行适当的改变,具有使用方便和应用程度较高的特点。此外,伪随机数Random类也可以利用nextDouble或者是Math等方法来产生随机数范围,通过对程序的分析可以采取不同的方法,实现伪随机数在JAVA程序中的最佳应用。
2)乱数中伪随机数的选取。JAVA实现算法可以从一个集合中来随机选取n个数,通过产生映射集合和数组的方法来产生伪随机数,将伪随机数放在相应的位置上来产生新伪随机数,通过对新伪随机数和原有伪随机数是否相同的检查来采取下一步的计算。新的伪随机数可以加入数组对象的下一个数组元素之内,在数组对象达到要求时则可以停止计算,在这种算法之中要对新伪随机数的重复性进行检查,避免新旧随机数之间的重复。
3)JAVA程序中伪随机数的生成。JAVA语言通常是利用线性同余法来产生随机数,这种数学方法具有周期长、随机性好、广泛采用和速度快的优点,此外,JAVA语言也可以通过Random方法来实现随机数的产生。但是无论哪种办法,都要将生成的随机数保存,在数列中选取随机数之后就要将选取的数值删掉,进行下一步的运算,伪随机数产生的过程就是对该程序重复的过程,在满足要求之后则可以停止该项计算。JAVA语言程序不仅可以在游戏中或应用程序中得到应用,还可以在银行系统进行使用,结合程序的要求来选择合适的伪随机数生成机制。
4)伪随机数在JAVA实例中的应用。JAVA语言可以应用的程序有很多,比如掷骰子或者是洗牌游戏等的应用程序,在该游戏中要用到JAVA中的Random算法。在应用程序中要用到两个骰子的滚动和显示,此时可以利用rollDice方法来滚动骰子,而用displayDice来显示骰子图片,在应用程序中可以生成6个数字之间的随机数,通过对指定位置骰子图片的显示可以计算出骰子表面的数据之和,实现游戏程序的开发和应用。
4结语
伪随机数在程序设计和软件开发中的应用比较广泛,性能佳和质量好的随机数是软件开发的追求。JAVA语言通过长期的完善和发展,已经成为主要的面向对象的程序设计语言,具有生成伪随机数的多种途径,可以满足不同设计者的设计要求。设计者可以结合程序的不同需要以及软件想要面向的对象来选择不同伪随机数的算法,取得良好的程序设计效果,实现伪随机数在JAVA程序中的最佳应用。
|
|
|
|
【对“硅谷杂志:伪随机数及其在JAVA程序中的应用分析”发布评论】 |
版权及免责声明:
① 本网站部分投稿来源于“网友”,涉及投资、理财、消费等内容,请亲们反复甄别,切勿轻信。本网站部分由赞助商提供的内容属于【广告】性质,仅供阅读,不构成具体实施建议,请谨慎对待。据此操作,风险自担。
② 内容来源注明“硅谷网”及其相关称谓的文字、图片和音视频,版权均属本网站所有,任何媒体、网站或个人需经本网站许可方可复制或转载,并在使用时必须注明来源【硅谷网】或对应来源,违者本网站将依法追究责任。
③ 注明来源为各大报纸、杂志、网站及其他媒体的文章,文章原作者享有著作权,本网站转载其他媒体稿件是为传播更多的信息,并不代表赞同其观点和对其真实性负责,本网站不承担此类稿件侵权行为的连带责任。
④ 本网站不对非自身发布内容的真实性、合法性、准确性作担保。若硅谷网因为自身和转载内容,涉及到侵权、违法等问题,请有关单位或个人速与本网站取得联系(联系电话:01057255600),我们将第一时间核实处理。
|
|
|
|