1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Euromilhoes em Basic

Discussão em 'Programação' iniciada por RuiBranco, 1 de Novembro de 2007. (Respostas: 12; Visualizações: 2035)

  1. RuiBranco

    RuiBranco Folding Member

    Última edição: 5 de Novembro de 2007
  2. HecKel

    HecKel The WORM

    Boas!

    Não percebo muito de BASIC, no entanto aí não vejo nada para validar se não há colisão de randoms, isto é, se não tens o azar de numa mesma sequência ficares com dois números iguais.
     
  3. kikofra

    kikofra Power Member

    colizão

    Bem encontrei uma colissão ta logo na 1ª aposta (2€)

    [​IMG]
     
  4. HecKel

    HecKel The WORM

    Pois, era disso que eu falava.

    Ele devia garantir que em cada grupo de 5 não há repetidos, e o mesmo para cada grupo de 2 estrelas. Ele simplesmente faz randoms.

    whitehatg, tenta validar isso. Podes recorrer à força bruta..., com um ciclo infinito até ele encontrar um diferente da lista..., mas assim corres o risco de ter algo mal no randomize e isso nunca sair daí. Provavelmente vai tornar o teu programa mais lento, mas em principio não será nada significativo.
     
  5. oscarolim

    oscarolim Power Member

    Que tal colocar os números todos num saco (neste caso array) e retirar 5 elementos aleatórios de lá (quando tiras um, removes mesmo do array). Rápido e elimina as colisões (obviamente para cada aposta é usado um array com os números todos!)
     
  6. slack_guy

    slack_guy Power Member

    Até podias completar mais um bocadinho com as chaves saídas até à data e com probabilidades.
     
  7. RuiBranco

    RuiBranco Folding Member

    hi,
    Eu não esqueci de evitar a colisão do numeros :007: so o fiz assim pq sou um calão :lol:, mas daqui a pouco ja posto o codigo para evitar isso. Obrigado atodos pelas ideias.
     
  8. RuiBranco

    RuiBranco Folding Member

    Se colidir por coluna pago um jantar :P ja actualizei em cima o codigo e o desempenho é o mesmo
    Código:
    Dim a(50)
        For i = 1 to 50
            a(i) = i
        Next i
        For i = 50 to 2 Step -1
            x = Int(Rnd(1) * i) + 1
            t = a(i)
            a(i) = a(x)
            a(x) = t
        Next i
        For i = 1 to 5
    next i
    
     
    Última edição: 4 de Novembro de 2007
  9. slack_guy

    slack_guy Power Member

    the beauty of oneliners ;)
    Código:
    [[email protected]:~/Perl ] perl -le '$R=sub{$_[0] + int rand(1 + $_[1] - $_[0])};$G=sub{$o={};$i=1; while($i<$_[0]){$r=sprintf"%0".length($_[1])."d",$R->(1,$_[1]);$o->{$r}=$i++ if!$o->{$r}}join q| |,sort{$a<=>$b}keys%$o};print $G->(6,50),q| [|,$G->(3,9),q|]| for 1..20;'
    
    Output:
    Código:
    06 12 17 39 44 [3 4]
    06 10 11 12 33 [2 9]
    11 12 13 42 50 [2 3]
    05 08 15 29 38 [3 5]
    07 09 15 39 47 [1 9]
    02 21 36 38 47 [5 7]
    02 16 27 40 44 [6 8]
    11 33 34 35 47 [7 8]
    22 23 36 38 40 [5 6]
    07 14 20 24 49 [4 5]
    17 22 25 26 46 [1 5]
    12 16 17 35 38 [3 4]
    12 14 18 30 46 [1 6]
    08 26 27 37 39 [3 6]
    06 09 16 18 45 [6 8]
    09 27 30 42 47 [2 5]
    07 12 19 46 47 [3 5]
    09 10 12 48 50 [8 9]
    03 08 26 38 44 [8 9]
    08 09 14 21 24 [3 6]
    
     
  10. kzip

    kzip Power Member

    Em vb(a) eu faria assim:
    Código:
        Randomize
        Dim B(5) As Integer
        Dim E(2) As Integer
        Dim i, j, k As Integer
        Dim Invalida As Boolean
        
        For k = 1 To 10 ' apostas
            For i = 1 To 5 ' bolas
            
                Do
                    Invalida = False
                    B(i) = Int(Rnd * 50) + 1
                    For j = 1 To i - 1
                        If B(i) = B(j) Then Invalida = True
                    Next j
                Loop Until Not Invalida
            Next i
            
            For i = 1 To 2 ' estrelas
                Do
                    Invalida = False
                    E(i) = Int(Rnd * 9) + 1
                    For j = 1 To i - 1
                        If E(i) = E(j) Then Invalida = True
                    Next j
                Loop Until Not Invalida
            Next i
            
            Debug.Print B(1), B(2), B(3), B(4), B(5), "-", E(1), E(2)
        Next k
    
     
  11. naoliveira

    naoliveira Power Member

    o que o teu código faz é reordenar a array a(50), tu não tens colisões porque o que fazes é reordenar os 50 nºs da array e assim imprimes sempre os 50 nºs diferentes, se alterares o nº de boletins para outro diferente de 10 vais ver que já tens problemas.

    Uma das soluções é a que é apresentada pelo kzip, sempre que geras um nº tens de verificar se ele já existe dentro dessa grelha.
     
  12. RuiBranco

    RuiBranco Folding Member

    Tenham calma rapazes :P isto n é um desafio é so um passatempo
    naoliveira concordo contigo não reparei nisso :) vou pegar no exemplo do kzip dp posto .

    Cumps
     
    Última edição: 5 de Novembro de 2007
  13. bigs

    bigs Power Member

    Código desses é quase imperceptível, principalmente para quem pouco percebe de perl.


    Uma solução para evitar colisões, é para cada chave, colocar os números num array com o tamanho da chave (um de 50 e outro de 2). Depois, quando sai um número retira-se o número que se encontrou, e depois, ou se reordena o array, ou se coloca o número no maior índice no lugar do que saiu, e em ambos os casos o array, depois de gerar um número para a aposta fica um índice mais pequeno (ou faz-se um random até menos um índice de cada vez).
     

Partilhar esta Página