-
随机数生成算法的研究
[
日期:
2006-05-23]
来源:
作者:
[
字体:
大
中
小
]
张敬新
摘
要:
本文
通过流程图和实际例程,
较详细地阐述了随机数生成的算法和具体的程序设计,
分析了其符合算法特征的特性。
关键词:
p>
随机数;算法;算法特征;程序设计
1
引言
在数据结构、
算法分析与设计、
科学模拟等方面都
需要用到随机数。
由于在数学上,
整数是
离散型的,
实数是连续型的,
而在某一具体的工程技术应用中
,
可能还有数据值的范围性和
是否可重复性的要求。
因此,
我们就整数随机数和实数随机数,
以及它们
的数据值的范围性
和是否可重复性,分别对其算法加以分析和设计。以下以
Visual
Basic
语言为工具,对整
p>
数随机数生成问题加以阐述,
而对于实数随机数生成问题,
只要稍加修改就可转化为整数随
机数生成问题。
根据整数随机数范围性和是否可重复性,可分为:
(1)
某范围内可重复。
(2)
某范围内不可重复。
(3)
枚举可重复。
(4)
枚举不可重复。
所谓范围,是指在两个数
n1
和
n2
之间。例如,在
100
和
p>
200
之间这个范围,那么,只要
产生的整
数随机数
n
满足
100≤n≤200<
/p>
,都符合要求。所谓枚举,是指有限的、已知的、若
干个不连续的
整数。例如,
34
、
20
、
123
、
5
、
800
这
5
个整数就是一种枚举数,也就是单
独可以一个个确定下来。
< br>
2
某范围内可重复
在
Visual
Basic
语言中,有一个随机数函数
Rnd
。
语法:
Rnd[(number)]
。
参数
number
可选,
number
的值决定了
Rnd
生成随机数的方式。
Rnd
函数返回小于
1
但大于或等于
0
的值。
如果
number
为
小于零
Rnd
生成
每次都相同的数字,并将
number
用作种子。
大于零
等于零
未提供
序列中的下一个随机数。
最近生成的数字。
序列中的下一个随机数。
在调用
Rnd
之前,
先使用无参数的
Randomize
语句初始化随机数生成器,
该生成器具有
一个基于系统计时器的种子。
若要生成某给定范围内的随机整数,可使用以下公式:
Int((upperbound
-
lowerbound
+
1)
*
Rnd
+
lowerbound)
这里,
upperbound
是此范围的上限,而
lowerbound
是范围的下限。
程序流程图:
程序例程:下面是一个生成
10
个
10~20
之间随机数的例子。
Private Sub Command1_Click()
lowerbound = 10
upperbound = 20
Randomize
For i = 1 To 10
random = Int((upperbound - lowerbound + 1) * Rnd +
lowerbound)
random;
Next
End
Sub
运行结果:
12
10
20
20
17
17
18
14
12
20
3
某范围内不可重复
要产生一定范围内
不可重复的随机数,
按通常的设计是把曾经生成的随机数保存起来作为历
史数据。
产生一个新的随机数后在历史数据搜索,
若找
到就重新产生一个新的再重复数据搜
索;否则就认为已经找到了一个新的不同随机数。<
/p>
例如,要由计算机随机产生
10
个
101
~
200<
/p>
之间互不相同的数。
程序流程图:
程序:
Private Sub Command2_Click()
Dim random(10) As Integer
lowerbound = 101
upperbound = 200
Randomize
For i = 1 To 10
Do
r = Int((upperbound - lowerbound
+ 1) * Rnd + lowerbound)
yes = 0
For j = 1 To i - 1
If r = random(j) Then yes = 1: Exit For
Next
Loop While
yes = 1
random(i) = r
r;
Next
End
Sub
运行结果:
199
174
147
126
120
190
192
146
122
111
粗看起来,
上面的程序似乎没有什么问题,
在
执行过程中程序也能够通过。
但,
仔细分析我
< br>们就会发现问题出在一个新产生的随机数是否已经存在的判定上。
既然是随机数,
那么从数
学的角度来说在概率上,每次产生的随机数
r
就有可能相同,尽管这种可能性很小,但确<
/p>
是一个逻辑性与正确性的问题。因此,每次产生的新的随机数
r<
/p>
都有可能是数组
random
的
前
i-1
个数中的某一个,也就是说程序在运行
过程中由此可能会导致死循环,那么,能否找
到一个不在数组
r
andom
中的随机数
r
的工作就变得
不确定了。从算法的角度来讲,在理论
上,程序失去了有穷性、有效性和确定性。
什么是算法?通常人们将算法定义为一个有穷的指令集,
这些指令为解决某一特定任务规定
了一个运算序列。一个算法应当具有以下
特征:
-
-
-
-
-
-
-
-
-
上一篇:按键精灵脚本开发教程:随机数写法
下一篇:matlab随机数生成方法