RANDOMIZE REPETINDO ESCOLHA DEMAIS

ASSISTENCYINFO 05/02/2015 17:04:34
#444330
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
ASSISTENCYINFO 05/02/2015 17:29:32
#444332
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?
MARCELO.TREZE 05/02/2015 19:42:58
#444337
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




FFCOUTO 05/02/2015 21:40:31
#444340
Resposta escolhida
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
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.
ASSISTENCYINFO 07/02/2015 11:36:26
#444360
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.
FFCOUTO 09/02/2015 08:34:25
#444396
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
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
ASSISTENCYINFO 10/02/2015 20:00:16
#444439
FFCOUTO muito obrigado deu certinho
Tópico encerrado , respostas não são mais permitidas