Euromilhoes em Basic

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.
 
colizão

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

2002628747259152052_rs.jpg
 
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.
 
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!)
 
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.
 
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:
the beauty of oneliners ;)
Código:
[me@mybox:~/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]
 
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
 
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

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.
 
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:
the beauty of oneliners ;)
Código:
[me@mybox:~/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;'

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).
 
Back
Topo