有没有更好的方法来设置生成随机数的几率并控制限制?
Is there a better way to set the odds to generating a random number and controling the limits?
我正在尝试做一个有 20 轮游戏的游戏。我指定了 0 到 8 来代表游戏中的物品。我需要随机数在 90% 的时间内是 0 到 5 之间的任何数字。我需要数字 6 和 7 在 4% 的时间内。而且,我需要 8 只有 2% 的时间。下面是我的代码,它有时可以工作,但通常会生成太多的 6、7 和 8。我看到代码的方式是它应该在大部分时间都能正常工作,但事实并非如此。有没有更好的方法来控制随机数以获得我需要更一致的百分比?
' Get the random number position into array
Public Sub GetNumPositions(ByVal positions() As Integer)
' 20 rounds, each round 5 numbers
' we want 2 times (8), 4 times (6 and 7)
' 2% 8, 4% 6, 4% 7, and 90% times 0 thru 5
For i As Integer = 0 To positions.Length - 1
Dim p As Integer = rndNums.Next(100)
If p < 90 Then
positions(i) = p \ 15
ElseIf p < 94 Then
positions(i) = 6
ElseIf p < 98 Then
positions(i) = 7
Else
positions(i) = 8
End If
Next
End Sub
你的代码很好。这是一个测试它的方法。它收集一些数字并计算它们的频率:
Sub Main()
Dim count = 100000000
Dim positions(count) As Integer
Dim frequencies(9) As Integer
GetNumPositions(positions)
For Each num In positions
frequencies(num) += 1
Next
For i As Integer = 0 To 8
Console.WriteLine(i & ": " & (100.0 * frequencies(i) / count) & " %")
Next
End Sub
结果是:
0: 14.994567 %
1: 15.000016 %
2: 15.01366 %
3: 14.996542 %
4: 15.002074 %
5: 15.00325 %
6: 4.002246 %
7: 3.999337 %
8: 2.000603 %
如您所见,频率与您的输入分布非常匹配。
我正在尝试做一个有 20 轮游戏的游戏。我指定了 0 到 8 来代表游戏中的物品。我需要随机数在 90% 的时间内是 0 到 5 之间的任何数字。我需要数字 6 和 7 在 4% 的时间内。而且,我需要 8 只有 2% 的时间。下面是我的代码,它有时可以工作,但通常会生成太多的 6、7 和 8。我看到代码的方式是它应该在大部分时间都能正常工作,但事实并非如此。有没有更好的方法来控制随机数以获得我需要更一致的百分比?
' Get the random number position into array
Public Sub GetNumPositions(ByVal positions() As Integer)
' 20 rounds, each round 5 numbers
' we want 2 times (8), 4 times (6 and 7)
' 2% 8, 4% 6, 4% 7, and 90% times 0 thru 5
For i As Integer = 0 To positions.Length - 1
Dim p As Integer = rndNums.Next(100)
If p < 90 Then
positions(i) = p \ 15
ElseIf p < 94 Then
positions(i) = 6
ElseIf p < 98 Then
positions(i) = 7
Else
positions(i) = 8
End If
Next
End Sub
你的代码很好。这是一个测试它的方法。它收集一些数字并计算它们的频率:
Sub Main()
Dim count = 100000000
Dim positions(count) As Integer
Dim frequencies(9) As Integer
GetNumPositions(positions)
For Each num In positions
frequencies(num) += 1
Next
For i As Integer = 0 To 8
Console.WriteLine(i & ": " & (100.0 * frequencies(i) / count) & " %")
Next
End Sub
结果是:
0: 14.994567 %
1: 15.000016 %
2: 15.01366 %
3: 14.996542 %
4: 15.002074 %
5: 15.00325 %
6: 4.002246 %
7: 3.999337 %
8: 2.000603 %
如您所见,频率与您的输入分布非常匹配。