Jump to content
SLIFE

Randomize

Recommended Posts

SLIFE

Boas a todos

Em termos de brincadeira e cá para casa, decidi efectuar um jogo de Bingo!

Não nada mais nada menos de que um form que contem diversos numeros e vai saindo um numero aleatorio, e assim preenchendo uma tabela com os respectivos numeros saidos.

O problema é o seguinte, eu coloquei uma verificação após gerar o numero aleatorio, a verificar se esse numero já saiu ou nao, e caso já tenha saido, entao volta a gerar novo numero.

Até maravilha, o problema é que quando os numeros já começam a ser muito (Os que sairam) o processo começa a ficar muito lento, e chega a demorar mais de 5 segundo ate surgir um novo numero.

Existe alguma maneira que possa resolver isto?

Tipo se já saiu o numero 5 entao não volta a gerar esse numero no randomize.

Por exemplo de gerar numero, apenas com base nos que nao sairam ainda!

Não me parece provavel, mas deixo aqui o pedido de ajuda ou de ideias para esta situação!

Cpts

SJC


Sandro Coelho

Share this post


Link to post
Share on other sites
Andrepereira9

Boas

Ve este tópico


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
SLIFE

De que forma verificas os números saídos?

Verifico atraves de uma lista que crio na memoria!


Sandro Coelho

Share this post


Link to post
Share on other sites
Rechousa

Porque é que não fazes ao contrário, que ao fim e ao cabo é o que se passa no jogo.

Imagina:

Tens um array com todos os números não sorteados - inicialmente essa lista está completamente cheia (de 1 a 99).

Fazes um randomize de 1 a 99 e vai-te dar um valor - imagina 25. Então vais retirar o valor da posição 25 do array e o teu array passa a ficar com 98 números.

Depois fazes novo randomize de 1 98 (número de elementos do array) e vai-te dar um número, imagina 12. Então retiras o valor da posição 12 do array e o teu array passa a ficar com 97 números. Assim sucessivamente até que o array fique vazio ou até que o jogo acabe.

Desta forma não tens de verificar se o número já saiu ou não, porque os números que estiverem no array não sairam :thumbsup:

Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Caça

Usa uma colecção do tipo List(Of Integer) para não teres de verificar se uma posição já foi eliminada


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
bioshock

Usa uma colecção do tipo List(Of Integer) para não teres de verificar se uma posição já foi eliminada

Ia sugerir o mesmo. Mas primeiro ia sugerir que ele mostrasse o código...

Share this post


Link to post
Share on other sites
SLIFE

Boas

Daqui a pouco já coloco aqui o codigo que tenho!

Se calhar estou a usar o caminho mais longo!

Pareceu-me que a ideia Rechousa, poderá ser uma boa ideia.

Em relação ao List(Of Integer), é mesmo isso que estou a utilizar!

O problema e que cada vez que sai um numero ele tem de verificar nessa list, se o numero ja se encontra lá, e se for caso disso entao volta a gerar outro numero!

Processo esse que pode ser bastante demorado!

Mas já coloco aqui o codigo, para darem uma vista de olhos!

Cpts

SJC


Sandro Coelho

Share this post


Link to post
Share on other sites
SLIFE

Boas

Então o codigo que tenho e mais ou menos isto:

(Não é o que esta a funcionar pois nao tenho aqui o portatil)

faz o randomize

NumeroSaido= 99 * Rnd() +1

Verifica se o numero já existe

Private Sub LerNumeros()
        Dim SR As New IO.StreamReader("c:\NumerosSaidos.txt", System.Text.Encoding.Default)
        While Not SR.EndOfStream
            ListaNumSaidos.Add(SR.ReadLine)
        End While
        SR.Close()
    End Sub
End Class

Compara se o numero que saiu já existe ou nao

Private Sub CompararNumeros()

        Dim LNumeros As List(Of Integer) = Nothing

        Dim NomeEncontrado As Boolean = False
        Lnumeros= ListaNumSaidos
        For Each LNumerosI As Integer In LNumeros
          
                If LCase(LNumerosI) = NumeroActual Then 
                   NumeroEncontrado = True
            Next
               If NumeroEncontrado = False Then 
                  EscreveNumero()
               Else 
                   NumeroEncontrado = False
        Next
    End Sub

É mais ou menos isto que tenho na minha app.

Poderá ter uma ou outra linha diferente, mas a base esta aqui.

Caso achem que esta mal, assim que poder posto o codigo que tenho no portatil e a funcionar!

Já agora ninguem me consegue dar uma ideia de colocar a funcionar como diz o Rechousa!!

Parece que a ideia dele não é má, visto que segundo ele diz, iria ter sempre o randomize dos numeros que nao tinham saido, logo nao precisava de andar a fazer comparações!

Cpts

SJC


Sandro Coelho

Share this post


Link to post
Share on other sites
SLIFE

Porque é que não fazes ao contrário, que ao fim e ao cabo é o que se passa no jogo.

Imagina:

Tens um array com todos os números não sorteados - inicialmente essa lista está completamente cheia (de 1 a 99).

Fazes um randomize de 1 a 99 e vai-te dar um valor - imagina 25. Então vais retirar o valor da posição 25 do array e o teu array passa a ficar com 98 números.

Depois fazes novo randomize de 1 98 (número de elementos do array) e vai-te dar um número, imagina 12. Então retiras o valor da posição 12 do array e o teu array passa a ficar com 97 números. Assim sucessivamente até que o array fique vazio ou até que o jogo acabe.

Desta forma não tens de verificar se o número já saiu ou não, porque os números que estiverem no array não sairam :thumbsup:

Espero ter ajudado.

Boas a ideia parece ser boa!

E possivelmente iria evitar paragens no randomize.

Nao me consegues arranjar um pequeno exemplo daquilo que falas?

Assim tentava por em pratica no meu projecto.

Cpts

SJC


Sandro Coelho

Share this post


Link to post
Share on other sites
SLIFE

Ninguem tem uma ideia de como poderei resolver os problemas de demora no randomize?

Alguem me consegue dar umas dica para tentar colocar a funcionar como descreve o Rechousa!

Cpts

SJC


Sandro Coelho

Share this post


Link to post
Share on other sites
bioshock

Vê lá se isto funciona:

Public Class Form1
    Dim ListaNumeros As New List(Of Integer)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim NumeroSaido As Integer
        Dim random As Random = New Random()
        ' 1 = minimo :: 10 = maximo
        NumeroSaido = random.Next(1, 10)
        If Not ListaNumeros.Contains(NumeroSaido) Then
            ListaNumeros.Add(NumeroSaido)
        ' Adiciona este controlo só para ires tendo uma noção dos números
            ListBox1.Items.Add(NumeroSaido)
        End If
    End Sub
End Class

Share this post


Link to post
Share on other sites
ribeiro55

Penso que a sugestão do Rechousa seja a mais rápida, uma vez que é apenas para garantir uma situação semelhante ao bingo.

Até podias ter 1 milhão de números que o algoritmo te respondia num piscar de olhos.

Uma sugestão de implementação:

        If Numeros.Count = 0 Then Throw New Exception("Acabaram-se os números")
        Dim tempIndex As Integer = New Random().Next(0, Numeros.Count - 1)
        Dim numero As Integer = Numeros(tempIndex)
        Numeros.RemoveAt(tempIndex)

        MsgBox(numero.ToString)

Partindo do início que existe uma List(Of Integer) chamada Numeros, com todos os números iniciais possíveis, alcançável no âmbito.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
SLIFE

Obrigado Ribeiro55. Mais uma vez magnifico e eficiente.

Obrigado tambem bioshock pela ajuda prestada.

Já agora mais uma pequena questão, existe alguma maneira de fazer o programa esperar que um ficheiro mp3 acabe, para depois continuar o codigo?

E que queria colocar, um som cada vez que fosse gerado um numero, som esse que iria dizer os numeros saidos.

E só apenas quando o som terminasse é que era gerado um novo numero. Isso é possivel?

Acabei por utilizar o exemplo do Ribeiro55, e funciona na prefeição.

De qualquer maneira gravei a do bioshock para ficar no meu arquivo de codigo!

Nunca se sabe quando poderá fazer falta.

Obrigado a todos.

Cpts

SJC


Sandro Coelho

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.