Notifications
Clear all

"Random" misterioso

2 Posts
2 Usuários
0 Reactions
1,053 Visualizações
(@mateus0203)
Posts: 53
Trusted Member
Topic starter
 

Bem amigos, estava a fazer uma macro pra gerar uma sequência de 15 números random entre 1 e 25 e observei que ao invés disso, ele está apenas gerando uma sequência, como se já houvesse um caminho predefinido! Se eu abro ela e mando ela gerar os 15 números três vezes, e eu fecho a planilha e abro ela novamente, e mando ela gerar novamente três vezes, ela gerar os mesmos três de antes na mesma ordem! Não entendi até agora onde pode haver um erro, pois o processo é pautado na geração de números aleatórios.

O código é este abaixo e gostaria de saber se alguém identifica o erro.

Sub RANDOM()

Dim num As Integer
Dim en As String
Dim cont As String


cont = 0

'Apaga os 15 números de antes
Range("T9", "AH9").Value = ""

'Guarda o endereço do primeiro número
Range("T9").Select
en = ActiveCell.Address

'Gera o primeiro número aleatório e coloca na célula
num = Int((25 - 1 + 1) * Rnd + 1)
ActiveCell = num


Do While cont <> "14"
deu:
'Gera o segundo número aleatório e vai pra primeira célula
num = Int((25 - 1 + 1) * Rnd + 1)
Range(en).Select

'Testa se é repetido, se não for, vai pra célula da direita testar novamente até chegar numa célula vazia
Do While ActiveCell <> ""
If ActiveCell = num Then
GoTo deu
Else
ActiveCell.Offset(0, 1).Select
End If
Loop

'Coloca na célula vazia o valor
ActiveCell = num

'Adiciona uma unidade até chegar em 14 e parar a repetição
cont = cont + 1
Loop

End Sub
 
Postado : 25/06/2017 12:08 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Mateus, bom dia.

A explicação para esse comportamento da função Rnd() está no próprio help da função:

...For any given initial seed, the same number sequence is generated because each successive call to the Rnd function uses the previous number as a seed for the next number in the sequence.

E a solução para evitar isso também está na mesma página:

...Before calling Rnd, use the Randomize statement without an argument to initialize the random-number generator with a seed based on the system timer.

Então, antes da primeira ocorrência de sua chamada à função Rnd ou logo no começo de sua Sub, use simplesmente:

  Randomize

ou, para garantir...

  Randomize Timer

 
Postado : 25/06/2017 7:46 am