Генератор случайных чисел не работает

У меня проблемы с функцией, которая генерирует случайные числа.

У меня есть игральные кости:

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() не случайный?

Другие вопросы по тегам