Генерация случайных чисел от 1 до 24 в vb.net - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь случайным образом создать список чисел от 1 до 24, разделенных ключом канала. Мне удалось заставить его работать, за исключением того, что каждый раз он генерирует один и тот же точный порядковый номер "17 | 13 | 14 | 7 | 8 | 19 | 1 | 20 | 18 | 2 | 10 | 21 | 9 | 24 | 23 | 15 | 12 | 16 | 22 | 6 | 3 | 4 | 5 | 11" . Как мне сделать его действительно случайным?

   Public Function DoesNoAlreadyExistInList(TheNumber As Integer, TheList As String) As Boolean
        Dim counter As Integer = 0
        If (TheList = Nothing Or TheList = "") And Not (TheList.Contains("|")) Then
        Else
            Dim numberlist() As String = TheList.Split("|")
            For Each n As String In numberlist
                Dim n_ As Integer = n
                If n_ = TheNumber Then
                    counter += 1
                Else
                    counter += 0
                End If
            Next
        End If
        If counter = 0 Then
            DoesNoAlreadyExistInList = False
        Else
            DoesNoAlreadyExistInList = True
        End If
End Function


   Protected Sub new_game_Click(sender As Object, e As EventArgs) Handles new_game.Click
        Dim intNo As Integer
        Dim blnExists As Boolean
        Dim counter As Integer = 0
        'Clear the listbox
        player1_cards.Value = Nothing
        'Do 25 times
        For intI = 0 To 23
            'Do this until we no the number is not already in the list
            Do
                'Get a random no 1 - 50
                intNo = Int((24 * Rnd()) + 1)
                'Check if the number is already in the list.
                blnExists = DoesNoAlreadyExistInList(intNo, player1_cards.Value)
            Loop Until blnExists = False
            'Add the number into the listbox.
            counter += 1
            If counter = 1 Then
                player1_cards.Value = player1_cards.Value & intNo
            Else
                player1_cards.Value = player1_cards.Value & "|" & intNo
            End If
        Next
        right_player_number.Text = player1_cards.Value
    End Sub

Ответы [ 3 ]

0 голосов
/ 09 апреля 2020

Список в. net относится к List(Of T), где T - это Type. Я создал List(Of Integer) для хранения уникальных случайных чисел. Поскольку вы ссылаетесь на добавление номера в список, я предположил, что player1_cards - это

<asp:ListBox ID="NumbersListBox" runat="server" />

, я просто изменил ID, чтобы удовлетворить меня. Не важно.

Я очистил DataSource и ItemsCollection или список.

Я создал экземпляр класса Random (включен в. net framework ) вне метода. Я могу использовать любой метод в Class. Я использовал метод .Next, чтобы получить случайное число. Я проверил методом .Contains списка и добавил его в список, если его там еще не было. После этого он выходит из Do и продолжает For l oop. Если он существует, Do повторяется до тех пор, пока не будет возвращена уникальная запись.

Наконец, установите DataSource в списке и DataBind для отображения чисел.

Если все, что вам нужно, это String, я показал, как это сделать с String.Join.

Dim rand As New Random

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim intNo As Integer
    Dim lst As New List(Of Integer)
    'Clear the listbox
    NumbersListBox.DataSource = Nothing
    NumbersListBox.Items.Clear()
    'Do 25 times ?????
    'This does not loop 25 times; it loops 24 times
    For intI = 0 To 23
        Do
            'Get a random no 1 - 50
            'rand.Next(inclusive of first value, exclusive of second value)
            intNo = rand.Next(1, 51)
            'Check if the number is already in the list.
            If Not lst.Contains(intNo) Then
                lst.Add(intNo)
                Exit Do
            End If
        Loop
    Next
    'Add the numbers into the listbox.
    NumbersListBox.DataSource = lst
    NumbersListBox.DataBind()
    NumbersListBox.SelectedIndex = 0
    right_player_number.Text = NumbersListBox.SelectedItem.ToString
    'To put the numbers into a String separated by a |
    Dim s = String.Join("|", lst)
    Debug.Print(s)
End Sub

Ваш Function не был нужен с этим кодом.

0 голосов
/ 09 апреля 2020

Если на самом деле вам нужны цифры от 1 до 24 в случайном порядке, то я бы предложил следующее:

Dim rng As New Random
Dim numbers = Enumerable.Range(1, 24).OrderBy(Function(n) rng.NextDouble())

Вы можете добавить ToArray вызов в конец этой второй строки, если Вы хотите, чтобы случайные числа в массиве. В основном это генерирует случайное значение для представления каждого числа, а затем сортирует числа по этим случайным значениям. Это очень похоже на перегрузку Array.Sort, которая сортирует два параллельных массива, используя один из них в качестве ключей для сортировки другого. Если вы хотите сделать это вручную, это будет выглядеть так:

Dim rng As New Random
Dim numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}
Dim keys = {rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble(),
            rng.NextDouble()}

Array.Sort(keys, numbers)

Если вы хотите, чтобы эти числа представляли собой один String, разделенный трубами, сделайте это:

Dim text = String.Join("|", numbers)

Вам не нужен вызов ToArray, чтобы сделать это, поскольку String.Join примет IEnumerable(Of T).

Если вам интересно, я использовал NextDouble вместо Next, потому что это является более эффективным. При генерации случайного Integer в диапазоне первым шагом является генерация случайного Double, который затем масштабируется и округляется. Поскольку эти значения используются только для сортировки, важна их случайность, а не их фактические значения. Таким образом, дополнительные шаги по масштабированию и округлению каждого случайного Double не имеют смысла.

0 голосов
/ 09 апреля 2020

См. Ответ от Питера О.

Я поместил "Randomize ()" перед "intNo = Int ((24 * Rnd ()) + 1)" в моем коде выше, что решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...