Вероятно, хорошей идеей будет разделить логику рандомизации и логику, которая заставляет данный цвет чаще создаваться.Например, это работает вполне нормально, предоставляя равные шансы каждому числу:
randomColor = CLng(rnd() * 5) + 2
Однако, как только вы получите randomColor, его можно изменить на основе некоторого процента, названного priorityPercentage
в функции:
Public Sub TestMe()
Dim counter As Long
Dim randomColor As Long
With Worksheets(1)
.Cells.Clear
For counter = 1 To 1000000
randomColor = CLng(rnd() * 5) + 2
.Cells(counter, 1) = GenerateColor(randomColor, 2, (0.4 - 0.4 * 1 / 6))
Next
.Cells(1, 2).Formula = "=COUNTIF(A:A,2)"
End With
End Sub
Public Function GenerateColor(randomColor As Long, _
priorityColor As Long, _
priorityPercentage As Double) As Long
If rnd() <= priorityPercentage Then
GenerateColor = priorityColor
Exit Function
End If
GenerateColor = CLng(rnd() * 5) + 2
End Function
Этот пример выполняется 1 миллион раз и записывает в B2
счетчик 2
.Причина для передачи 0.4 - 0.4 * 1.6
в параметре состоит в том, чтобы убедиться, что вероятность для 2
составляет ровно 40%.У нас есть 1/6 для каждого из возможных 6 чисел - [2,3,4,5,6,7]
.Таким образом, времена, когда мы не входим в If rnd() <= priorityPercentage
, также принимаются во внимание.