Inquiridor
Problema ao fazer sorteio aleatório sem repetição

Pergunta
-
Olá,
Não conheço muito de programação, mas com a ajuda desde e de outros fóruns estou tentando criar uma sub que faça o sorteio de um número entre vários outros (sem repetir) e depois carregue o número correspondente a linha de um arquivo txt que possui várias palavras. A parte de acessar os dados no txt está funcionando bem, mas no sorteio dos números eles têm se repetido. Se alguém puder me ajudar agradeço muito.
Este é o código que consegui até agora:
Dim rnd As New Random
Dim lista As New List(Of Integer)
Dim numero As Integer
Dim palavra as Integer
numero = rnd.Next(0, 10) 'gera um número aleatório (coloquei 10 para ficar mais fácil de testar)
If lista.Contains(numero) = False Then 'verifica se o número está contido na lista'
lista.Add(numero) 'caso não esteja, o número é adicionado a lista
Else 'caso o número já esteja na lista ela segue a rotina abaixo
Do
numero = rnd.Next(0, 10) 'gera outro número aleatório
Loop Until lista.Contains(numero) = False 'continua gerando até achar um que não esteja na lista
lista.Add(numero) 'ao achar o número ele é adicionado a lista
End If
'Abaixo é a parte que está funcionando ok
Dim oTxtIn As New IO.StreamReader("C:\dados\teste.txt") ' Carrega o arquivo na memória.
Dim oTxtContent As String = oTxtIn.ReadToEnd() ' Lê os dados e insere na String.
Dim oTxtArr() As String = oTxtContent.Split(Environment.NewLine) ' Quebra por linha o conteúdo.
palavra = oTxtArr(numero) 'joga o valor da busca no arquivo de texto na variável palavra
txtpalavra.Text = palavra 'atribui finalmente a palavra sorteada a uma textbox
Todas as Respostas
-
Olá Luiz,
Você está declarando a lista dentro do método? Se sim, a condição que checa se o número não existe sempre vai retornar False (porque a lista está vazia)...
Já tentou debugar pra entender qual está sendo o fluxo de execução? Qual parte está com um comportamento estranho?
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Olá André, obrigado pela resposta.
Não consegui resolver o problema dentro daquela estrutura, então mudei-a um pouco.
Desta vez coloquei o seguinte código no carregamento do formulário:
Dim lista As New List(Of Integer)
Dim rnd As New Random
Dim i As Integer
Do Until i = 10
numero = rnd.Next(0, 10)
If lista.Contains(numero) = False Then
lista.Add(numero)
i = i + 1
Else
Do
numero = rnd.Next(0, 10)
Loop Until lista.Contains(numero) = False
lista.Add(numero)
i = i + 1
End If
LoopAo carregar ele vai sortear 10 números e salvá-los numa list. Na prática não está funcionando bem assim, ele tem salvado uma média de 7 números, mas pra mim essa média é o suficiente para o que eu preciso. O importante é que ele não está repetindo nenhum número.
Depois vêm a sub que busca a palavra no arquivo txt, que coloquei desse jeito:
Dim numero As Integer
Dim palavra As Stringnumero = lista.First
Dim oTxtIn As New IO.StreamReader("C:\dados\teste.txt") ' Carrega o arquivo na memória.
Dim oTxtContent As String = oTxtIn.ReadToEnd() ' Lê os dados e insere na String.
Dim oTxtArr() As String = oTxtContent.Split(Environment.NewLine) ' Quebra por linha o conteúdo.
palavra = oTxtArr(numero)
txtpalavra.Text = palavra
lista.Remove(numero)Ela usa o primeiro registro da list que havia sido criada no carregamento do formulário e depois remove-o para que não seja repetido.
Não está perfeito a nível de código, uma vez que a quantidade certa de palavras que eu peço para sortear a princípio não estão sendo todas sorteadas, mas como eu não preciso de todas elas, essa estrutura me atende.
Abraço
-
Olá Luiz,
Estranho... Enfim, preparei um exemplo de um método para realizar esse tipo de sorteio... Dê uma olhada e veja se te atende:
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 1 de maio de 2014 08:01
-
Olá André,
Primeiramente muito obrigado pela ajuda prestada.
Utilizei seu código e não só resolvi meu problema como percebi que meu último código não estava errado e sim a forma como eu estava chamando o método durante a execução do programa.
Só fazendo uma observação, ao utilizar o código original que vc postou eu tive o seguinte erro reportado:
Error 1 Value of type '1-dimensional array of Integer' cannot be converted to '1-dimensional array of String' because 'Integer' is not derived from 'String'.
Consegui solucioná-lo alterando a declaração das variáveis "SorteiaNumerosSemRepetir" e "numerosSorteados" como Strings ao invés de Integer.
Obrigado mais uma vez.