Usuário com melhor resposta
Gerar Números Aleatórios Apenas de uma Lista

Pergunta
-
Olá Bom dia,
Gostaria de gerar números aleatórios a partir de uma lista.
Pr exemplo, tenho uma lista com os números 1,3,5,9 e gostaria de criar uma função onde fosse gerado números aleatórios, porém apenas entre esses da lista (esse é só um exemplo, minha idéia seria criar uma função onde eu pudesse colocar os números e fosse gerado o número aleatóriamente dentre a lista).
Obrigado,
Abs,
Respostas
-
Tentando ajudar também....
Option Explicit Sub teste() Dim arrValores() As String Dim strNumeros As String strNumeros = "5;10;15;20;25;30;35;40;45;50" 'aqui eu informei quais os números que podem ser sorteados separados por ponto e virgula arrValores = Split(strNumeros, ";") randonArray arrValores End Sub Sub randonArray(arr() As String) Dim i As Long 'será apenas um contador para os loops Dim intMinimo As Long 'limite inferior do array Dim intMaximo As Long 'limite superior do array Dim intQtdSorteadosTotal As Integer 'representará a quantidade de itens que devem ser sorteados Dim r As Integer 'será o número randomico Dim blnContem As Boolean 'retornará T or F caso o valor randomizado pertenca a matriz Dim intItem As Integer 'representará o item na lista de sorteados Dim arrSorteados() As Integer intMinimo = 99 'Considerar que o maior valor será 99 intMaximo = 0 'Considerar que não existirão números negativos intQtdSorteadosTotal = 5 'Quantidade de itens que devem ser sorteados 'laço condicional para identificar os limites do array For i = LBound(arr) To UBound(arr) - 1 'passar por todos os items do array If arr(i) < intMinimo Then intMinimo = arr(i) 'Identificar o limite inferior randomico If arr(i) > intMaximo Then intMaximo = arr(i) 'Identificar o limite superior randomico Next i intItem = 0 'representará o índice no array de itens sorteados ReDim arrSorteados(intQtdSorteadosTotal) 'redimensiona a matriz sorteados 'laço condicional que realizará o sorteio, verificando se o numero sorteado está na lista Do r = Int(intMaximo * Rnd) + intMinimo 'sorteia blnContem = False 'inicializa o verificador 'laço condicional para verificar se o numero sorteado está na lista For i = LBound(arr) To UBound(arr) - 1 If r = arr(i) Then 'se o numero sorteado for igual a algum da lista blnContem = True 'atribui True para o verificador End If Next i 'após passar por todos os itens do array If blnContem = True Then 'se o verificador for True arrSorteados(intItem) = r 'adiciona o valor randomizado a lista de sorteados intItem = intItem + 1 'incrementa o indice da lista de sorteados If intItem > intQtdSorteadosTotal Then 'verifica se o total de itens já sorteados é maior que o total que deve ser sorteado Exit Do 'se for, sai do loop End If End If Loop printArray arrSorteados End Sub 'método auxiliar para ver o que contem no array Sub printArray(arr() As Integer) Dim i As Long For i = LBound(arr) To UBound(arr) - 1 Debug.Print arr(i) Next i End Sub
Natan
- Sugerido como Resposta William John Adam Trindade quarta-feira, 17 de setembro de 2014 17:02
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 17 de setembro de 2014 22:43
Todas as Respostas
-
Paulo veja se os links te ajudam.
Você terá de adequar a sua necessidade mas a ideia ja está implementada.
http://superuser.com/questions/637149/excel-how-to-use-vba-to-repeatedly-generate-random-numbers
http://www.excel-pratique.com/en/vba_tricks/generate_a_random_number.php
Esse me parece que ele faz o random em cima de um array: http://stackoverflow.com/questions/18543169/unique-random-numbers-using-vba
-
-
Tentando ajudar também....
Option Explicit Sub teste() Dim arrValores() As String Dim strNumeros As String strNumeros = "5;10;15;20;25;30;35;40;45;50" 'aqui eu informei quais os números que podem ser sorteados separados por ponto e virgula arrValores = Split(strNumeros, ";") randonArray arrValores End Sub Sub randonArray(arr() As String) Dim i As Long 'será apenas um contador para os loops Dim intMinimo As Long 'limite inferior do array Dim intMaximo As Long 'limite superior do array Dim intQtdSorteadosTotal As Integer 'representará a quantidade de itens que devem ser sorteados Dim r As Integer 'será o número randomico Dim blnContem As Boolean 'retornará T or F caso o valor randomizado pertenca a matriz Dim intItem As Integer 'representará o item na lista de sorteados Dim arrSorteados() As Integer intMinimo = 99 'Considerar que o maior valor será 99 intMaximo = 0 'Considerar que não existirão números negativos intQtdSorteadosTotal = 5 'Quantidade de itens que devem ser sorteados 'laço condicional para identificar os limites do array For i = LBound(arr) To UBound(arr) - 1 'passar por todos os items do array If arr(i) < intMinimo Then intMinimo = arr(i) 'Identificar o limite inferior randomico If arr(i) > intMaximo Then intMaximo = arr(i) 'Identificar o limite superior randomico Next i intItem = 0 'representará o índice no array de itens sorteados ReDim arrSorteados(intQtdSorteadosTotal) 'redimensiona a matriz sorteados 'laço condicional que realizará o sorteio, verificando se o numero sorteado está na lista Do r = Int(intMaximo * Rnd) + intMinimo 'sorteia blnContem = False 'inicializa o verificador 'laço condicional para verificar se o numero sorteado está na lista For i = LBound(arr) To UBound(arr) - 1 If r = arr(i) Then 'se o numero sorteado for igual a algum da lista blnContem = True 'atribui True para o verificador End If Next i 'após passar por todos os itens do array If blnContem = True Then 'se o verificador for True arrSorteados(intItem) = r 'adiciona o valor randomizado a lista de sorteados intItem = intItem + 1 'incrementa o indice da lista de sorteados If intItem > intQtdSorteadosTotal Then 'verifica se o total de itens já sorteados é maior que o total que deve ser sorteado Exit Do 'se for, sai do loop End If End If Loop printArray arrSorteados End Sub 'método auxiliar para ver o que contem no array Sub printArray(arr() As Integer) Dim i As Long For i = LBound(arr) To UBound(arr) - 1 Debug.Print arr(i) Next i End Sub
Natan
- Sugerido como Resposta William John Adam Trindade quarta-feira, 17 de setembro de 2014 17:02
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quarta-feira, 17 de setembro de 2014 22:43
-
-