RANDOMIZE REPETINDO ESCOLHA DEMAIS
Ola pessoal blz, Seguinte eu fiz um sistema para rodar em tvs na minha cidade onde vinculo propagandas do comercio, previsaao do tempo, loterias etc.
O detalhe e o seguinte eu fiz um RND para pegar ate 52 telas. Tipo se recebe=1 ento aprece previsao do tempo e assim por diante.
So que tenho percebido a repeticao constante de algumas tela e nao sei o que pode estar acontecendo pois umas estao aparecendo mais que outros!
Ai o anunciante senta na frente da tv e fica esperando aparecer a propaganda dele e nao aparece. Parece mentira mas e verdade eles sentam mesmo kkkkk
esse e o codigo que utilizo
Randomize
Recebe = Int(Rnd() * 52)
Se alguem pider me dar uma ideia agradesso
O detalhe e o seguinte eu fiz um RND para pegar ate 52 telas. Tipo se recebe=1 ento aprece previsao do tempo e assim por diante.
So que tenho percebido a repeticao constante de algumas tela e nao sei o que pode estar acontecendo pois umas estao aparecendo mais que outros!
Ai o anunciante senta na frente da tv e fica esperando aparecer a propaganda dele e nao aparece. Parece mentira mas e verdade eles sentam mesmo kkkkk
esse e o codigo que utilizo
Randomize
Recebe = Int(Rnd() * 52)
Se alguem pider me dar uma ideia agradesso
Fiz um teste apertando um botao para ele gerar um numero aleatorio entre 1 e 52 e realmente ele repete mais uns numeros do que outro e as vezes demora mais de hora para pegar um numero! o que pode ser?
Bom vai ser sempre uma questão do sorteio mesmo, (sorte, rs) não é problema e sim o efeito do randomize mesmo, mas eis minha pergunta se vc quer que o cliente veja todas as telas, porque não usa um laço for ou do while, exibindo tela a tela.
outra opção é criar uma lista dos ultimos numeros sorteados, tipo os 10 ultimos, comparando e não permitindo repetição
outra opção é criar uma lista dos ultimos numeros sorteados, tipo os 10 ultimos, comparando e não permitindo repetição
Caro colega, ASSISTENCYINFO
Em primeiro lugar, o código que você postou já possui uma pequena falha: ele não irá atribuir o número 52.
O Rnd() gera números entre 0 e 1, inclusive, desta forma você precisa acrescentar 1 ao resultado.
Randomize
Recebe = Int(Rnd() * 52) + 1
Outra coisa. Como deveria funcionar o seu esquema? Sorteia um item até todos forem executados e daà retorna em outra sequência?
Se for desta forma, use a rotina abaixo e você terá uma sequência aleatória sem repetição. Basta você adaptar a sua necessidade.
Num módulo
No form
Após todos os Ãndices serem usados você pode chamar novamente a rotina e ela te dará outa sequência.
Em primeiro lugar, o código que você postou já possui uma pequena falha: ele não irá atribuir o número 52.
O Rnd() gera números entre 0 e 1, inclusive, desta forma você precisa acrescentar 1 ao resultado.
Randomize
Recebe = Int(Rnd() * 52) + 1
Outra coisa. Como deveria funcionar o seu esquema? Sorteia um item até todos forem executados e daà retorna em outra sequência?
Se for desta forma, use a rotina abaixo e você terá uma sequência aleatória sem repetição. Basta você adaptar a sua necessidade.
Num módulo
Private Const QTHRESH As Long = 7
Private Declare Sub CopyMemory Lib [Ô]kernel32[Ô] Alias [Ô]RtlMoveMemory[Ô] (Destination As Any, Source As Any, ByVal Length As Long)
Public Sub CopyArray(vSource() As Variant, vDestiny() As Variant)
Dim i As Integer
Dim lb As Long, ub As Long
[ô]Determina os limites da matriz
lb = LBound(vSource)
ub = UBound(vSource)
[ô]Redimensiona a matriz de destino
ReDim vDestiny(lb To ub)
[ô]Inicia a cópia
For i = lb To ub
vDestiny(i) = vSource(i)
Next
End Sub
Public Function IsEmptyArray(vArray As Variant) As Boolean
On Local Error Resume Next
Dim memVal As Long
CopyMemory memVal, ByVal VarPtr(vArray) + 8, ByVal 4 [ô]get pointer to array
CopyMemory memVal, ByVal memVal, ByVal 4 [ô]see if it points to an address...
IsEmptyArray = (memVal = 0) [ô]...if it does, array is intialized
End Function
Public Function InArray(vMatrix() As Variant, ByVal nNumber As String) As Boolean
On Error Resume Next
Dim i As Integer, lCount As Long
lCount = UBound(Filter(vMatrix, nNumber, True, vbBinaryCompare))
InArray = (lCount > -1)
End Function
Public Sub ShiftArray(vMatrix() As Variant, Optional ByVal RemoveIndex As Integer = 1)
Dim i As Integer
Dim lb As Long, ub As Long
[ô]Se o Ãndice a ser removido está fora do intervalo da matriz, sai da rotina
If RemoveIndex < LBound(vMatrix) Then Exit Sub
If RemoveIndex > UBound(vMatrix) Then Exit Sub
lb = LBound(vMatrix)
ub = UBound(vMatrix)
For i = RemoveIndex To ub - 1
vMatrix(i) = vMatrix(i + 1)
Next
If lb <= (ub - 1) Then
ReDim Preserve vMatrix(lb To ub - 1)
Else
ReDim vMatriz(0)
End If
End Sub
Public Sub ShuffleArray(vMatrix() As Variant, ByVal Seed As Long)
Dim lb As Long, ub As Long
Dim nIdx As Integer, pIdx As Integer
Dim p As Integer
Dim vTmp1() As Variant, vTmp2() As Variant
[ô]Copia a matriz para uma matriz temporária
CopyArray vMatrix, vTmp1
[ô]Determina o limite da matriz
lb = LBound(vMatrix)
ub = UBound(vMatrix)
[ô]Cria a matriz secundária
ReDim vTmp2(lb To ub)
Randomize Seed [ô]Inicia a sequencia aleatória
nIdx = ub [ô]Atribui o limite da matriz
pIdx = 1 [ô]Inicia o Ãndice da matriz aleatória
Do
[ô]Seleciona um número aleatório qualquer
p = Int(Rnd(Seed) * nIdx) + 1
vTmp2(pIdx) = vTmp1(p) [ô]Atribui o número selecionado da matriz
ShiftArray vTmp1, p [ô]Remove o Ãndice da matriz
pIdx = pIdx + 1 [ô]Incrementa o Ãndice
nIdx = nIdx - 1 [ô]Diminui o limite de sorteio
Loop While nIdx > 0
[ô]Copia a nova matriz
CopyArray vTmp2, vMatrix
End Sub
No form
Private Function GerarListaPropaganda(ByVal Qtde As Integer) As Variant()
Dim i As Integer
Dim rndKey As Long
Dim lista() As Variant
[ô]Inicializa a matriz
ReDim lista(1 To Qtde)
[ô]Preenche a lista temporária com a
[ô]sequência numérica indicada pela variável Qtde
For i = 1 To Qtde
lista(i) = i
Next
[ô]Cria a semente para as funções randômicas
[ô]Aqui pode ser qualquer valor
[ô]Como exemplo usar o valor da função Timer() multiplicado por 9
rndKey = CLng(Timer()) * 9
[ô]Gera os Ãndices aleatórios
ShuffleArray lista, rndKey
[ô]Retorna a lista com a sequência aleatória
GerarListaPropaganda = lista
End Function
Private Sub Command1_Click()
Dim ret1 As String, ret2 As String
ret1 = Join(GerarListaPropaganda(52), [Ô], [Ô])
ret2 = Join(GerarListaPropaganda(52), [Ô], [Ô])
MsgBox ret1 & vbCr & vbCr & ret2
End Sub
Após todos os Ãndices serem usados você pode chamar novamente a rotina e ela te dará outa sequência.
FFCOUTO obrigado pela força so uma duvida teria como em vez dele gerar todos os numeros de uma vez ele fazer um cada vez tipo eu nao preciso de todos os numeros de uma vez e sim que cada vez que entrar na tela de sorteio ele sorteie um numero so para o sistema poder escolher a tela que vai ser aberta.
ASSISTENCYINFO,
O que você deve fazer é executar esta rotina ao executar o programa para ter a lista já randomizada.
Você vai precisar de uma variável global para armazenar o Ãndice da matriz que você usou e cada sorteio você incrementa esse Ãndice e mostra o número associado a ele.
é algo do tipo
Num módulo
No Load do Form principal
Acho que é isso
O que você deve fazer é executar esta rotina ao executar o programa para ter a lista já randomizada.
Você vai precisar de uma variável global para armazenar o Ãndice da matriz que você usou e cada sorteio você incrementa esse Ãndice e mostra o número associado a ele.
é algo do tipo
Num módulo
Public indexUsado As Integer
Public matrizNum() As Variant
No Load do Form principal
Private Sub Form_OnLoad()
matrizNum = GerarListaPropaganda(52)
indexUsado = 0
[ô]Restante da lógica do sistema
End Sub
Private Sub commandSorteio_Click()
[ô]Aqui você verifica se o número máximo foi atingido, no seu caso 52 ou outra quantidade necessária
[ô]Gera uma nova matriz aleatória
If indexUsado >= 52 Then
matrizNum = GerarListaPropaganda(52)
indexUsado = 0
End If
indexUsado = indexUsado + 1
MostrarPropaganda indexUsado [ô]Aqui é usa lógica para exibir a propaganda
End Sub
Acho que é isso
FFCOUTO muito obrigado deu certinho
Tópico encerrado , respostas não são mais permitidas