Как сделать так, чтобы числа не повторялись из указанного списка c - PullRequest
0 голосов
/ 02 мая 2020

Я бился головой о стену, пытаясь понять, как сделать так, чтобы числа не повторялись из определенного списка c, который я создал. Может кто-нибудь, пожалуйста, помогите? Как только номер выбран, я не хочу, чтобы он был выбран снова. Похоже на цифры. Удаление (число) не работает

 Private Sub GetMoneyRand()
    If randomLog.Count = numberList.Count Then
        MsgBox("No more number for random")
        Return
    End If
    For i As Integer = 1 To 100
        Dim rndDummy As Integer = CInt(numMax.Value * Rnd())
        lblRandomNumber.Text = rndDummy
        Threading.Thread.Sleep(30)
        Application.DoEvents()
    Next

    Randomize()
    Dim r As New Random
    Dim numbers As New List(Of Integer)
    numbers.AddRange(New Integer() {1, 16, 31, 46, 61, 10, 15, 14, 75, 33, 11, 19, 25, 44, 50, 72, 2, 44, 20, 30})

    Dim number As Integer = numbers(r.Next(0, numbers.Count))
    For x As Integer = 1 To 20
        numbers.Remove(number)

    Next
    randomLog.Add(number)
    lblRandomNumber.Text = number
    numberList(number).BackColor = Color.LightBlue

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вы должны использовать стек или очередь. Они оба удаляют элементы по мере их использования.

Private numbers As Integer() = {1, 16, 31, 46, 61, 10, 15, 14, 75, 33, 11, 19, 25, 44, 50, 72, 2, 44, 20, 30}
Private rng As New Random

Private Sub OutputNumbersInRandomOrder()
    Dim randomisedNumbers As New Queue(Of Integer)(numbers.OrderBy(Function(n) rng.NextDouble()))

    Do Until randomisedNumbers.Count = 0
        Dim number = randomisedNumbers.Dequeue()

        Console.WriteLine(number)
    Loop
End Sub

Каждый раз, когда вы звоните Dequeue, первый номер удаляется из списка и возвращается. Вы можете делать это сколько угодно раз, создавая новую очередь каждый раз, когда предыдущая пуста, например,

Private numbers As Integer() = {1, 16, 31, 46, 61, 10, 15, 14, 75, 33, 11, 19, 25, 44, 50, 72, 2, 44, 20, 30}
Private randomisedNumbers As Queue(Of Integer)
Private rng As New Random

Private Function GetRandomNumber() As Integer
    If randomisedNumbers Is Nothing OrElse randomisedNumbers.Count = 0 Then
        randomisedNumbers = New Queue(Of Integer)(numbers.OrderBy(Function(n) rng.NextDouble()))
    End If

    Return randomisedNumbers.Dequeue()
End Function

Вы можете сделать то же самое с Stack(Of Integer) и вызовом Pop. Единственное отличие состоит в том, что стек принимает элементы с другого конца - LIFO вместо FIFO. Поскольку элементы рандомизированы и добавлены в одно и то же время, в результате на самом деле нет никакой разницы, особенно учитывая, что вызов OrderByDescending в любом случае обратит результаты обоих типов. Для иллюстрации:

Dim numbers = {1, 2, 3, 4, 5}

Dim q1 As New Queue(Of Integer)(numbers)
Dim s1 As New Stack(Of Integer)(numbers)

Console.WriteLine("q1:")

Do Until q1.Count = 0
    Console.WriteLine(q1.Dequeue())
Loop

Console.WriteLine("s1:")

Do Until s1.Count = 0
    Console.WriteLine(s1.Pop())
Loop

Array.Reverse(numbers)

Dim q2 As New Queue(Of Integer)(numbers)
Dim s2 As New Stack(Of Integer)(numbers)

Console.WriteLine("q2:")

Do Until q2.Count = 0
    Console.WriteLine(q2.Dequeue())
Loop

Console.WriteLine("s2:")

Do Until s2.Count = 0
    Console.WriteLine(s2.Pop())
Loop

Вывод:

q1:
1
2
3
4
5
s1:
5
4
3
2
1
q2:
5
4
3
2
1
s2:
1
2
3
4
5
0 голосов
/ 03 мая 2020

Пожалуйста, включите Option Strict. Это процесс из 2 частей. Сначала для текущего проекта. В обозревателе решений дважды щелкните Мой проект. Выберите Compile слева. В раскрывающемся списке Option Strict выберите ON. Второй для будущих проектов - Go в Меню инструментов -> Параметры -> Проекты и решения -> VB по умолчанию. В раскрывающемся списке Option Strict выберите ON. Это избавит вас от ошибок во время выполнения.

Чтобы создать список с уникальными случайными числами, используйте метод .Contains List(of T) перед добавлением нового случайного числа в список.

Private numbers As New List(Of Integer) From {1, 16, 31, 46, 61, 10, 15, 14, 75, 33, 11, 19, 25, 44, 50, 72, 2, 44, 20, 30}
Private r As New Random

Private Sub AddRandomsToList()
    Dim i = r.Next(0, 21)
    If numbers.Contains(i) Then
        MessageBox.Show("Sorry that number is already in the list. Try Again.")
    Else
        numbers.Add(i)
    End If
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    AddRandomsToList()
End Sub

Чтобы удалить дубликаты из существующего списка, используйте метод расширения .Distinct. Он вернет новый список уникальных элементов при вызове .ToList

Private numbers As New List(Of Integer) From {1, 16, 1, 46, 61, 16, 15, 14, 61, 46, 11, 19, 25, 46, 50, 50, 2, 44, 20, 30}
Private r As New Random
Private Sub RemoveDuplicate()
    Dim UniqueNumbers = numbers.Distinct().ToList
    For Each i In UniqueNumbers
        Debug.Print(i.ToString)
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...