none
Problema ao fazer sorteio aleatório sem repetição RRS feed

  • 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



    terça-feira, 18 de março de 2014 02:37

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

    terça-feira, 18 de março de 2014 08:43
    Moderador

  • 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
            Loop

    Ao 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 String       

            numero = 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


    terça-feira, 18 de março de 2014 19:08
  • 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:

    http://www.andrealveslima.com.br/blog/index.php/2014/03/19/sorteio-de-numeros-sem-repetir-em-c-vb-net/


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quarta-feira, 19 de março de 2014 14:32
    Moderador
  • 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.

       

    quinta-feira, 20 de março de 2014 06:11