none
Gerar Números Aleatórios Apenas de uma Lista RRS feed

  • 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,

    terça-feira, 16 de setembro de 2014 12:48

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

    terça-feira, 16 de setembro de 2014 18:28

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

    Abraço.

    terça-feira, 16 de setembro de 2014 13:28
  • Muito obrigado Fernando!

    Vou dar uma estudada nos links.

    Abraço.

    terça-feira, 16 de setembro de 2014 14:10
  • 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

    terça-feira, 16 de setembro de 2014 18:28
  • Perfeito Natan!

    Muito obrigado,


    Abs,

    quarta-feira, 17 de setembro de 2014 14:45
  • A disposição!

    Não esqueça de Marcar Como Resposta!


    Natan

    quarta-feira, 17 de setembro de 2014 14:57