APP下载

高级Actionscirpt3.0随机数的研究

2013-04-29许敏雷丽娟

电脑迷 2013年7期
关键词:素数数组奇数

许敏 雷丽娟

摘 要 本文对随机数生成函数在Flash的應用中的弱点进行分析,并提出新的方案,并加以代码实现。

关键词 伪随机数 随机数生成函数

中图分类号:TP311.12 文献标识码:A

随机数原本是为试验中得到随机结果而产生的,在统计学中经常使用随机数来抽取试验样本或者进行蒙特卡罗模拟法计算等。在现实中随机数常发生在如掷骰子、抽签、彩票等物理现象中,我们称这样的随机数叫做物理性随机数。真正意义上的物理性随机数是在实验过程中表现的分布概率,是不可预测的、不可见的;而在计算机中的随机数是按照随机数的算法模拟产生的,其结果是确定的并且也是可见的,故在计算机上利用随机函数产生的随机数,称为伪随机数。

伪随机数在计算机中使用比较普遍,尤其在密码学上,它是利用计算机高级语言里的随机数函数与密码学中的原始理论算法相结合来生成不可逆的新密码。在我们熟知的计算机高级语言里,如C语言、Java等语言都具备对应的随机数生成函数。这些随机数生成函数的使用起来相对简单,就C语言为例:你只需在程序中调用rand()函数便可以生成0-RAND_MAX之间的随机数,要想产生整数,只需调用取整函数int( )使其数据规整即可。

在计算机中实现随机数相当简单,这种简单使得我们在Flash的应用中缺少灵活性或许说并不能满足一些特殊场合的需求,因此,我们需在原始随机数函数Math.random( )基础上增加一些数学的技巧来实现新的随机数函数,以方便ActionScript3代码在不同环境中得到更为广泛的应用。

在Flash游戏编程中,经常会利用随机函数来实现游戏中的随机地图和随机游戏内容等,因而对于游戏而言,强调随机函数的重要性一点也不为过。举个找茬游戏例子,几乎每局比赛的内容让玩家无法预先得知,并且每局的关键茬点也不同,这些都是对于随机元素的合理运用。自然,游戏这样做的目的在于保持有趣、不确定性以及平等,让玩家永远不知道下局会发生什么。游戏的随机性在大多数游戏中早已被广泛使用,并且除了游戏之外,也有其他地方在使用随机数,如图形效果等。随机数存在于各种现实生活的形状和大小中,各种不同的随机性就成为我们所要研究的方向。

以下是我们如何建立函数使之完成对应的变化。

1 整数

让我们来看看从它的数学公式:Math.floor(Math.random() * (1 + High - Low)) + Low这是用于生成随机整数,或许你还记得。但只要在扩展一点,我们便可以看到另一方式:Math.floor(Math.random() * Range) + Low使用Range来取代(1 + High - Low)范围。

2 非整数

在现实当中,整数的需求并不是常见的,而非整数却不然,要想获得非整数,其实在程序实现很简单,只需去掉Math.floor(),则原先的公式变成:Math.random() * Range + Low这时随机产生的非整数便常用于随机旋转和随机大小的案例中。让我们来看个例子,要获得0到3以内的非整数,它的公式很显然就是Math.random() * 3,但需要记住它的取值范围是包括0,但不包括3。

3 间距公式

说到间距,一般是针对整数而言,自然在公式前又该带回Math.floor()。这一次,我们来加强难度,生成任何随机从0到100之间的奇数:Math.floor(Math.random * 50) * 2 + 1,通过Math.floor(Math.random * 50)产生0到50的随机整数,再乘以2,得到偶数,再加1,便是奇数了。如果将其总结,公式该为:Math.floor(Math.random * Range) * Spacing + Low。

4 四舍五入

如果生成一个0到100随机的非整数,让它们的间距为0.5时,四舍五入就起到关键性的作用。但如果不使用Math.round(),则需要变通地解决,Math.floor(Math.random * 200) / 2,先将范围扩大至200,然后通过除以2来还原范围,得到小数0.5的间距。

5 左右数

让我们再看另外一种间距,例如-1和1,它们分别在0的左边和右边,间距为2,我们称-1和1为左右数。其公式为:Math.floor(Math.random() * 2) * 2 – 1。

6 素数

最后,我们来讨论下随机素数的实现,素数并非像偶数或奇数那样间隔均匀,单纯通过数学公式很难完成,这时我们需要创建一个素数数组:var primes:Array = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29],利用数组的下标的自然数规律来实现取出随机素数的工作,其公式:primes[Math.floor(Math.random() * primes.length)]。由于范围是数组的长度并且AS3数组的下标由0开始,所以我们可以取到在素数数组中任意素数。

7总结

最后需要注意的是,你可以使用int()函数来取代Math.floor(),它产生的结果完全一样,但如果Math.random()乘以一个负数,在测试时,Math.floor()比int()运算速度快15倍左右。这是罕见的,所以如果要考虑运行速度的问题,则改变程序本身,使用快速代码就显得格外重要了。

参考文献

[1] 随机数的产生.豆丁网:http://www.docin.com/p-571025674.html.2013.

[2] Gary Rosenzweig,ActionScript3.0游戏编程.人民邮电出版社,2012.

猜你喜欢

素数数组奇数
孪生素数
两个素数平方、四个素数立方和2的整数幂
JAVA稀疏矩阵算法
奇数凑20
奇数与偶数
JAVA玩转数学之二维数组排序
关于奇数阶二元子集的分离序列
关于两个素数和一个素数κ次幂的丢番图不等式
奇妙的素数
寻找勾股数组的历程