Escolha números randoms exclusivos

Estou tentando randomizar um número no VB.NET 3 vezes. E toda vez que eu aleatoriamente um número, ele deve ser diferente dos outros dois números.

Por exemplo, eu tenho 3 inteiros. Int1, Int2 e Int3. Vou randomizar Int1 entre 1-10, e então eu vou randomizar Int2 entre 1-10, no entanto, o valor não deve ser igual ao valor que eu randomizado em Int1 e o mesmo vale para Int3 não deve ser igual a Int1 e Int2.

Eu descobri como randomizar um número, este é o código que estou usando:

Dim RndNumber As Random Dim num,num2 As Integer RndNumber = New Random num = RndNumber.Next(1, 11) num2 = RndNumber.Next(1, 11) 

Agora eu estou preso em como eu faço num2 randomizar um número entre 1-10 que não é igual a num.

Eu agradeço qualquer ajuda, obrigado.

Em todos os exemplos, o RNG é um gerador de números randoms criado a partir da class Random da NET:

 Private RNG = New Random() 

Linq

Se você precisa apenas de dois ou três, você pode fazer um loop até que a escolha atual não esteja no conjunto de resultados. Mas isso é ainda mais simples usando alguns methods de extensão:

 Dim nums = Enumerable.Range(1, 10). OrderBy(Function(r) RNG.Next). Take(3). ToArray() 

Isso começa com todos os números entre 1 e 10, coloca-os em ordem aleatória, pega os 3 primeiros e os armazena no array nums . Eu usei a forma multilinha, quebrando após o . s para ilustrar os passos.

Basta alterar o intervalo, tamanho / contagem e elemento Take() conforme necessário. Por exemplo, para algo como uma loteria com 5 números únicos 1-69 (forma condensada):

 Dim winners = Enumerable.Range(1, 69).OrderBy(Function(r) RNG.Next()).Take(5).ToArray() Dim powerball = Enumerable.Range(1, 26).OrderBy(Function(r) RNG.Next()).Take(1).First 

Como a Powerball pode ser uma repetição dos primeiros números, ela vem de seu próprio pool. Como só queremos um, não precisamos de um array, apenas o First() .

Manual

É bom saber a lógica dessas coisas, então isso mostra uma versão manual. Isso é diferente, selecionando e verificando valores randoms:

 ' picked value storage Dim picks As New List(Of Int32) Dim pick As Int32 ' current candidate Do pick = RNG.Next(1, 11) If picks.Contains(pick) = False Then picks.Add(pick) End If Loop Until picks.Count = 3 

Em vez de soltas vars, isso usa uma lista para manter as escolhas. Isso torna mais fácil ver se a escolha atual já foi selecionada. Para mais do que apenas alguns valores, use um HashSet(Of Int32) vez de uma List para desempenho.

Pares Aleatórios

Para criar um conjunto random de números com 2 de cada, como para um jogo de correspondência, basta dobrar o pool de valores base e colocá-los em ordem aleatória:

 ' create pool of 2 values each for 1-13 Dim nums = Enumerable.Range(1, 13).ToArray() ' concat the set to make 2 of each value, randomize Dim pool = nums.Concat(nums).OrderBy(Function(r) RNG.Next).ToArray() 

Para um método manual, você teria que verificar a contagem de cada valor no loop.

‘Use up’ Picks

Mais uma variação é quando você precisa de um pool de randoms usados ​​periodicamente, mas você não sabe quantos você precisará com antecedência. Exemplos seriam as bolas para um jogo BINGO ou um baralho de cartas.

Em vez de um indexador global que aponta para o último slot usado (ou o próximo slot a ser usado), um Stack(Of T) (ou uma Queue ) “usará” os valores conforme necessário:

 ' create, randomize pool of 100 ints Dim nums = Enumerable.Range(1, 100).OrderBy(Function(r) RNG.Next).ToArray ' use array to create Stack Dim shoe As New Stack(Of Int32)(nums) ' same as: Dim shoe = New Stack(Of Int32)(Enumerable.Range(1, 100). OrderBy(Function(r) RNG.Next).ToArray()) 

Isso começa basicamente o mesmo com 100 inteiros, randomizados e armazenados em uma matriz, mas não há Take(n) porque queremos todos eles. Esses valores são então armazenados em uma coleção de pilhas. Usando isso:

 Console.WriteLine(shoe.Count) For n As Int32 = 1 To 3 Console.WriteLine("Picked #{0}", shoe.Pop) Next Console.WriteLine(shoe.Count) 

Quando você Pop um valor, ele é removido da coleção automaticamente. Se você usar muitos valores do calçado, deverá verificar a contagem para garantir que ela não esteja vazia.

100
Escolhido # 12
Escolhido # 69
Escolhido # 53
97

Depois de desenhar 3 valores, o sapato tem apenas 97 valores restantes.

Notas Aleatórias

Em todos os casos, seu gerador Random deve ser um object de nível de formulário que você cria uma vez . Nunca os crie em um loop ou você provavelmente obterá o mesmo valor repetidamente.

O método de randomização OrderBy(Function(r) RNG.Next) geralmente é bom o suficiente para uso casual, mas é ineficiente. Se você estiver randomizando conjuntos grandes e / ou usando freqüentemente, você deve considerar o uso de um shuffle apropriado, como o shuffle de Fisher-Yates mostrado aqui .