Рандомизировать числа из указанного списка c - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу, чтобы мое приложение заполняло случайные наборы чисел, используя список указанных c чисел, которые я выбрал. Например; У меня есть набор чисел (1,3,5,9,21,70,56). Я хочу иметь возможность рандомизировать порядок, в котором эти числа выбраны. Это возможно? Мы разыгрываем моего босса, пока мы работаем из дома. Он выигрывает каждую игру / лотерею у нас на работе. Поскольку мы работали дома, я создал игру bin go ... Каждый должен выбрать строку (1-15), а числа с соответствующей строкой - это ваша карта bin go .... мы хотим подшутить над ним ... для строки, которую он выбирает, мы не хотим, чтобы какое-либо число генерировалось на этой строке. например: если он выбирает строку 1, числа в этой строке равны 1,16, 31, 46 и 61, я не хочу, чтобы выбирались какие-либо из этих чисел. У меня есть рандомизатор для выбора случайных чисел (так он может хотя бы один раз). Но мы не хотим, чтобы он победил. Поэтому я хочу, чтобы btnGetMoney вызывал процедуру GetMoneyRand, чтобы выбрать только числа из массива чисел, которые я перечислю. Возможно ли это?

Public Class Form1
Private numberList As New Dictionary(Of Integer, Button)
Private randomLog As New List(Of Integer)


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    radVertical.Checked = True
    FlowLayoutPanel1.AutoScroll = True

    numMin.Value = 1
    numMax.Value = 75
    numMin.Minimum = 1
End Sub

Private Sub radVertical_CheckedChanged(sender As Object, e As EventArgs) Handles radVertical.CheckedChanged
    FlowLayoutPanel1.FlowDirection = If(radVertical.Checked, FlowDirection.TopDown, FlowDirection.LeftToRight)
End Sub

Private Sub StartGame()
    btnRandom.Enabled = True
    btnStart.Enabled = False
    btnStop.Enabled = True
    GroupBox1.Enabled = False
    GroupBox2.Enabled = False
    btnGetMoney.Enabled = True
    Dim numRange As List(Of Integer) = Enumerable.Range(numMin.Value, numMax.Value).ToList()

    For Each number In numRange
        Dim btn As New Button()
        btn.Name = "btn" & number
        btn.Size = New Size(40, 40)
        btn.FlatStyle = FlatStyle.Flat
        btn.Text = number
        btn.Font = New Font("Microsoft Sans Serif", 14)

        FlowLayoutPanel1.Controls.Add(btn)

        numberList.Add(number, btn)
    Next
End Sub

Private Sub StopGame()
    btnRandom.Enabled = False
    btnStart.Enabled = True
    btnStop.Enabled = False
    GroupBox1.Enabled = True
    GroupBox2.Enabled = True

    FlowLayoutPanel1.Controls.Clear()
    numberList.Clear()
    randomLog.Clear()

    lblRandomNumber.Text = "000"
End Sub

Private Sub DoRandomNumer()
    If randomLog.Count = numberList.Count Then
        MsgBox("No more number for random")
        Return
    End If

    ' animation random
    For i As Integer = 1 To 100
        Dim rndDummy As Integer = CInt(numMax.Value * Rnd())
        lblRandomNumber.Text = rndDummy
        Threading.Thread.Sleep(10)
        Application.DoEvents()
    Next

    Randomize()

    Dim rndNumber As Integer = (numMax.Value * Rnd())
    While randomLog.Contains(rndNumber) Or rndNumber = 0
        rndNumber = (numMax.Value * Rnd())
    End While

    randomLog.Add(rndNumber)
    lblRandomNumber.Text = rndNumber
    numberList(rndNumber).BackColor = Color.LightBlue
End Sub
Private Sub GetMoneyRand()


End Sub
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    StartGame()
End Sub

Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
    StopGame()
End Sub

Private Sub btnRandom_Click(sender As Object, e As EventArgs) Handles btnRandom.Click
    DoRandomNumer()
End Sub

Private Sub btnGetMoney_Click(sender As Object, e As EventArgs) Handles btnGetMoney.Click
    GetMoneyRand()
End Sub

Конечный класс

Ответы [ 2 ]

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

if number = 1 then
generate new number
elseif number = 16 then
generate new number
elseif number = 31 then
generate new number
elseif number = 46 then
generate new number
elseif number = 61 then
generate new number
else

exit do 'exits the loop if number is different then above :)

loop
0 голосов
/ 29 апреля 2020
Dim rng As New Random
Dim myRandomList = myList.OrderBy(Function(item) rng.NextDouble()).ToArray()

Это создаст массив, содержащий элементы из исходного списка в случайном порядке. Не имеет значения тип списка (подойдет любой IEnumerable(Of T)) или тип элементов. Вы можете вызвать ToList вместо ToArray, если вы хотите List(Of T) вместо массива, или вы можете отбросить ToArray и передать упорядоченный список в конструктор для очереди, если вы хотите выделить элементы один по одному, например

Dim rng As New Random
Dim myRandomQueue As New Queue(Of Integer)(myList.OrderBy(Function(item) rng.NextDouble()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...