Генератор случайных чисел не работает
У меня проблемы с функцией, которая генерирует случайные числа.
У меня есть игральные кости:
Public Class dice
Private isHold As Boolean = False
Private rnd As Random
Private rolledDots As Integer
Public Sub roll()
If isHold = False Then
rnd = New Random
rolledDots = rnd.Next(1, 7)
End If
End Sub
End Class
Я кидаю кубики через класс rollcup:
Public Class rollCup
Public dices As New List(Of dice)
Sub New()
For i = 0 To 5
dices.Add(New dice)
Next
End Sub
Public Sub rollDices()
For Each dice In dices
dice.roll()
Next
End Sub
End Class
Проблема в том, что кубики не генерируют случайные числа. Каждый кубик сгенерировал одно и то же число. Я могу достигнуть случайных чисел только путем сна в потоке:
Public Sub roll()
If isHold = False Then
rnd = New Random
System.Threading.Thread.Sleep(50)
rolledDots = rnd.Next(1, 7)
End If
End Sub
или показывая каждый номер в окне сообщения:
Public Sub roll()
If isHold = False Then
rnd = New Random
rolledDots = rnd.Next(1, 7)
MessageBox.Show(rolledDots)
End If
End Sub
Есть ли другой ответ на мою проблему? пс. Извините за плохой английский.
2 ответа
Вот ваш класс игры в кости с несколькими изменениями. Попробуйте. Проблема заключалась в том, что вы создавали новый случайный случай в последовательности, в результате чего возвращаемые числа были одинаковыми.
Public Class dice
Private isHold As Boolean = False
Private Shared rnd As New Random '<<<< note Shared
Private rolledDots As Integer
Public Sub roll()
If Not Me.isHold Then
Me.rolledDots = dice.rnd.Next(1, 7)
End If
End Sub
End Class
Посмотреть RandomWrapper
Я думаю, что ваша проблема в том, что генератор случайных чисел основан на времени, поэтому он создает "случайное" значение на основе текущего времени. И поскольку разные кубики запускаются практически в одно и то же время, вы получите одно и то же случайное число. Смотрите: Почему Random() не случайный?