Notifications
Clear all

RND & [rand()] em Sorteio Loterias

7 Posts
3 Usuários
0 Reactions
1,505 Visualizações
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

estava montando uma planilha de sorteio aleatorio "basicamente juntando coisas que já tinha feito"
mas me deparei com um problema
RND
dependendo da situação repete constantemente as sequencias demasiadamente , chegando a um ponto que tudo gerado passa ser a copia do que já tem
cheguei ao ponto de embaralhar a tabela a cada extração dos valores
resolveu, mas não para tudo
em uma busca para achar uma solução me deparei com [rand()]
que se usa da mesma maneira, mas com um custo na performance bem maior

nas sequencias não resolvia nem mesmo Randomize

não sei se existe alternativas e como não uso isso de aleatorio não tinha me deparado com essa situação antes
para poucas sequencias geradas o RND funciona até que relativamente bem
tipo para a quina, mega ia bem, mas para a lotomania repetia de monte

 
Postado : 23/07/2017 2:30 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Faaala, Ed, beleza?

...nas sequencias não resolvia nem mesmo Randomize ...

Vc usou Randomize sem nenhum argumento?

Experimente usando como semente a hora do sistema... acho que vai resolver:

...
  Randomize Timer
  núm = Rnd
...

O colega Mateus tb estava com essa dúvida: ("Random" misterioso)

 
Postado : 23/07/2017 4:13 pm
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

Ola Edson
eu tentei outras alternativas sim mas por vezes o rnd trazia sequencias repetidas em gerações muito grandes
o rand é mais lento mas não teve esse problema tornando até aleatorio demais :P
em poucas sequencias o rnd não apresenta problemas mas em listagens longas sim , pelo menos para mim apresentou
e olha e a propria macro já tem seu fator aleatorio dentro do aleatorio não escolhendo dezenas diretamente e sim posições onde essas estão

olha a macro aí "perdão pela bagunça fiz ela rapidamente para outra pessoa e acabei perdendo mais tempo no RND "

Sub Escolha_aleatoria()
     Dim c2 As Long, nn As Long, Li As Long, L As Long, C As Long, N As Long, Vx As Long, Dmx As Long, N2 As Long, pp As Boolean
     Li = 12    'linha inicial de saida
     Vx = Range("val_max").Value2     ' maior dezena presente
     Dmx = Range("qt_dez").Value2  ' quantidade de dez por grupo
     qtlin = Range("qt_lin").Value2     ' quantidade de jogos gerados

     qtf = Range("qt_fixas").Value2
     If qtf > 0 Then
          N = 1
          ReDim fixas(1 To qtf) As Long
          tab0 = Range("fixas").Value2
          For C = 1 To UBound(tab0, 2)
               If tab0(1, C) > 0 And tab0(1, C) <= Vx Then
                    fixas(N) = tab0(1, C)
                    qtf = N
                    N = N + 1
                    N2 = N2 + 1
               End If
          Next
     End If

     qt1 = Range("qt_tab_1").Value2
     If qt1 > 0 Then
          ReDim tab_1(1 To qt1) As Long
          tab0 = Range("tab_1").Value2
          N = 1
          For C = 1 To UBound(tab0, 2)
               For L = 1 To UBound(tab0, 1)
                    If tab0(L, C) > 0 And tab0(L, C) <= Vx Then
                         tab_1(N) = tab0(L, C)
                         qt1 = N
                         N = N + 1
                         N2 = N2 + 1
                    End If
               Next
          Next
     End If

     qt2 = Range("qt_tab_2").Value2
     If qt2 > 0 Then
          ReDim tab_2(1 To qt2) As Long
          tab0 = Range("tab_2").Value2
          N = 1
          For C = 1 To UBound(tab0, 2)
               For L = 1 To UBound(tab0, 1)
                    If tab0(L, C) > 0 And tab0(L, C) <= Vx Then
                         tab_2(N) = tab0(L, C)
                         qt2 = N
                         N = N + 1
                         N2 = N2 + 1
                    End If
               Next
          Next
     End If


     ReDim sorteadas(1 To qtlin, 1 To Dmx)


     lf = ULinhaRangeEdcronos("E", "BC")
     If lf >= Li Then Range(Cells(Li, 6), Cells(lf, 55)).ClearContents

     If N2 < Dmx Then MsgBox "dezenas insuficientes para preencher grupo": Exit Sub

     tmn = Range("tb_min").Value2
     tmx = Range("tb_max").Value2
     If tmn <= tmx And tmx <= qt1 Then pp = True
     zxz = 6

     For L = 1 To Range("qt_lin").Value2
          c2 = 1
          Call VBA.Randomize     '(10)
          If qtf > 0 Then
               For C = 1 To qtf     'UBound(fixas)
                    sorteadas(L, c2) = fixas(C)
                    c2 = c2 + 1
                    If c2 > Dmx Then GoTo saida
               Next
          End If


          If zxz < 1 Then zxz = 3 Else zxz = zxz - 1
          If qt1 > 0 And pp Then
               Z = [rand()]
               tt = Int(((tmx - tmn + 1) * ([rand()])) + tmn)

               nn = qt1     'UBound(tab_1)
               Embaralhador tab_1
               dex = tab_1

               For d = 1 To nn
volta:
                    If tt = 0 Then GoTo ttt2
                          vvv = Int((nn * [rand()]) + 1)
                    If dex(vvv) = 0 Then
                         GoTo volta
                    Else
                         sorteadas(L, c2) = dex(vvv)
                         dex(vvv) = 0
                         c2 = c2 + 1
                         If c2 > Dmx Then GoTo saida
                         tt = tt - 1

                    End If
               Next
          End If
ttt2:

          If qt2 > 0 Then
               nn = qt2     'UBound(tab_2)
               Embaralhador tab_2
               dex = tab_2

               tt = nn
               For d = 1 To nn
volta2:
                    vvv = Int((nn * [rand()]) + 1)

                    If dex(vvv) = 0 Then
                         GoTo volta2
                    Else
                         sorteadas(L, c2) = dex(vvv)
                         dex(vvv) = 0
                         c2 = c2 + 1
                         If c2 > Dmx Then GoTo saida
                         tt = tt - 1
                         If tt = 0 Then GoTo saida
                    End If
               Next
          End If
saida:
     Next

     Range("f" & Li, Cells(UBound(sorteadas, 1) + Li - 1, Dmx + 5)) = sorteadas
End Sub

 
Postado : 23/07/2017 4:36 pm
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

a planilha

acho que pode ser util em outros projetos

 
Postado : 23/07/2017 5:29 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não sei se auxiliar, mas no anexo como utilizo. Não recordo de onde obtive a rotina, somente fiz pequenas adaptações a minha necessidade.
Tem uma para cada sorteio, mas pode ser adaptado para um único com dados variáveis na planilha

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/07/2017 7:09 am
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

obrigado reinaldo
particularmente não sou fa do aleatorio, mesmo pq "quando" jogo é 1 ou 2 jogos apenas
fiz para ajuda de outros e só postei aqui por causa desse fato que encontrei
essa planilha que fiz atende a todas as loterias , claro que nem tem conferencia já que o intuito era apenas um aleatorio com opção de dezenas fixas e uma certa quantidade de dezenas escolhidas

 
Postado : 24/07/2017 7:30 am
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

analisando a rotina que o renaldo mandou acho que descobri o pq do meu criar tantas sequencias iguais com RND

no caso o RND gera o aleatorio pelo espaço temporal entre uma chamada e outra
como a minha rotina trabalha com array e não tem que verificar se o valor já foi sorteado não tem um lapso de tempo grande entre uma chamada e outra e é praticamente igual isso faz com que apareçam sequencias muito parecidas

e no meu codigo apesar do RAND ser mais lento como não tem loop para saber se a dezena já foi sorteada na linha acaba sendo bem rapido valendo a pena o uso

 
Postado : 25/07/2017 6:17 am