O Excel pode produzir uma distribuição aleatória de um tamanho fixo e uma soma fixa?

0

Precisamos de uma macro ou fórmula do Excel ou algo que possa produzir uma distribuição aleatória de inteiros, de modo que o conjunto de resultados tenha um tamanho fixo e uma soma fixa. Mais especificamente, queremos simular um mês inteiro de pontos de dados inteiros (portanto, um tamanho fixo) cujo total representa a demanda daquele mês (daí a soma fixa). Esse recurso já existe no Excel ou de terceiros? Se não, alguma dica sobre como escrever uma?

Estou procurando algo parecido com isto:

GetSetWithSum( count: 5, sum: 36)

O resultado de tal fórmula seria algo assim:

5
13
9
6
3
    
por flipdoubt 09.11.2010 / 12:15

1 resposta

2

O código a seguir funciona, mas tem a possibilidade de retornar 0 para um ou mais dos valores, dependendo da rapidez com que ele atinge o total necessário (usando seu exemplo, se o primeiro número aleatório for 36, os outros quatro será 0). o bom pessoal do Stack OverFlow pode ser melhor em escrever códigos que evitam isso do que eu.

Código Gerador Aleatório Central

Sub RandomNumbers(ByVal ReqNum As Integer, ByVal ReqSum As Integer, Output As Collection)
    Dim NewNum As Integer, SumNum As Integer
    Dim I As Integer

    SumNum = 0
    Do Until (SumNum = ReqSum) Or (Output.Count = (ReqNum - 1))
        Randomize Timer
        NewNum = Int((ReqSum - SumNum) * Rnd + 1)
        SumNum = SumNum + NewNum
        Output.Add NewNum
    Loop
    If Output.Count < ReqNum Then
        If SumNum < ReqSum Then
            Output.Add (ReqSum - SumNum)
        Else
            NewNum = Output.Count
            For I = (NewNum + 1) To ReqNum
                Output.Add 0
            Next I
        End If
    End If
End Sub

você pode chamar este Sub usando código com algo ao longo das linhas deste. Este código simplesmente coloca os valores aleatórios na coluna A.

Dim Numbers As New Collection, NumNum As Integer, SumofNum As Integer

Range("A:A").ClearContents
NumNum = 5
SumofNum = 36
Call RandomNumbers(NumNum, SumofNum, Numbers)
For SumofNum = 1 To Numbers.Count
    NumNum = Numbers(SumofNum)
    Cells(SumofNum, 1).Value = NumNum
Next SumofNum
    
por 09.11.2010 / 16:22