BlitzMax/模块/数学/随机数
外观
随机模块包含用于生成随机数的命令。
生成的数字并不真正随机,因为如果没有特殊的硬件支持,软件算法无法生成“真实”的随机数。
相反,算法会生成看起来像是随机的数值。实际上,每个生成的数值实际上都依赖于上一个生成的数值。
可以使用 SeedRnd 命令设置随机数生成器的“状态”。一种常见的做法是在程序启动时使用系统时间作为随机数生成器的种子,例如
SeedRnd MilliSecs()
这可以确保随机数生成器在每次运行程序时不会处于相同状态,这会导致它生成相同的随机数序列。
函数 RndFloat#()
描述: 生成随机浮点数
返回值: 范围在 0(包含)到 1(不包含)之间的随机浮点数
示例:
' RndFloat.bmx
' Two players take turns shooting at a target. The first hit wins.
' Player 1 hits 30% of the time, player 2 hits 40%.
' What is the probability that player 1 wins?
Function winner() ' play game once, return winner 1 or 2
Repeat
If RndFloat() < 0.3 Then Return 1
If RndFloat() < 0.4 Then Return 2
Forever
End Function
Local count[3]
trials = 1000000
For n = 1 to trials
count[ winner() ] :+ 1
Next
Print "Estimated probability = " + ( Float( count[1] ) / Float( trials ) )
Print
Print " Exact probability = " + ( 15.0 / 29.0 )
Input ; End
函数 RndDouble!()
描述: 生成随机双精度浮点数
返回值: 范围在 0(包含)到 1(不包含)之间的随机双精度浮点数
示例:
' RndDouble.bmx
' Two players take turns shooting at a target. The first hit wins.
' Player 1 hits 30% of the time, player 2 hits 40%.
' What is the probability that player 1 wins?
Function winner() ' play game once, return winner 1 or 2
Repeat
If RndDouble() < 0.3 Then Return 1
If RndDouble() < 0.4 Then Return 2
Forever
End Function
Local count[3]
trials = 1000000
For n = 1 to trials
count[ winner() ] :+ 1
Next
Print "Estimated probability = " + ( Double( count[1] ) / Double( trials ) )
Print
Print " Exact probability = " + ( 15.0 / 29.0 )
Input ; End
函数 Rnd!( min_value!=0,max_value!=1 )
描述: 生成随机双精度浮点数
返回值: 范围在 min(包含)到 max(不包含)之间的随机双精度浮点数
信息: 可选参数允许您以 3 种方式使用 Rnd
| 格式 | 结果 |
| &Rnd() | 范围在 0(包含)到 1(不包含)之间的随机双精度浮点数 |
| &Rnd(_x_) | 范围在 0(包含)到 n(不包含)之间的随机双精度浮点数 |
| &Rnd(_x,y_) | 范围在 x(包含)到 y(不包含)之间的随机双精度浮点数 |
示例:
' Rnd.bmx
' Use Rnd() to estimate area inside the unit circle x^2 + y^2 = 1.
totalpoints = 1000000
For n = 1 to totalpoints
x! = Rnd( -1.0, 1.0 ) ' Generate random point in 2 by 2 square.
y! = Rnd( -1.0, 1.0 )
If x*x + y*y < 1.0 Then pinpoints{{typo help inline|reason=similar to pinpoints|date=September 2022}} :+ 1 ' point is inside the circle
Next
' Note: Ratio of areas circle/square is exactly Pi/4.
Print "Estimated area = " + ( 4.0 * Double(inpoints)/Double(totalpoints) )
Print
Print " Exact area = " + Pi ' 4 * Pi/4, compare with estimate
Input ; End
函数 Rand( min_value,max_value=1 )
描述: 生成随机整数
返回值: 范围在 min(包含)到 max(包含)之间的随机整数
信息: 可选参数允许您以 2 种方式使用 Rand
| 格式 | 结果 |
| &Rand(x) | 范围在 1 到 x(包含)之间的随机整数 |
| &Rand(x,y) | 范围在 x 到 y(包含)之间的随机整数 |
示例:
' Rand.bmx
' Toss a pair of dice. Result is in the range 1+1 to 6+6.
' Count how many times each result appears.
Local count[13]
For n = 1 To 3600
toss = Rand(1,6) + Rand(1,6)
count[toss] :+ 1
Next
For toss = 2 To 12
Print LSet(toss, 5)+count[toss]
Next
函数 SeedRnd( seed )
描述: 设置随机数生成器种子
示例:
' RndSeed.bmx and SeedRnd.bmx ( one example for both ) ' Get/Set random number seed. SeedRnd MilliSecs() seed=RndSeed() Print "Initial seed="+seed For k=1 To 10 Print Rand(10) Next Print "Restoring seed" SeedRnd seed For k=1 To 10 Print Rand(10) Next
函数 RndSeed()
描述: 获取随机数生成器种子
返回值: 当前随机数生成器种子
信息: 与 SeedRnd 结合使用,RndSeed 允许您重现随机数序列。
示例:
' RndSeed.bmx and SeedRnd.bmx ( one example for both ) ' Get/Set random number seed. SeedRnd MilliSecs() seed=RndSeed() Print "Initial seed="+seed For k=1 To 10 Print Rand(10) Next Print "Restoring seed" SeedRnd seed For k=1 To 10 Print Rand(10) Next