有没有更好的方法来设置生成随机数的几率并控制限制?

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 %

如您所见,频率与您的输入分布非常匹配。