Escolhendo n números com sum fixa

Em algum código eu quero escolher n números randoms em [0,1) que summ 1 .

Eu faço isso escolhendo os números independentemente em [0,1) e normalizando-os dividindo cada um pela sum total:

 numbers = [random() for i in range(n)] numbers = [n/sum(numbers) for n in numbers] 

Meu “problema” é que a distribuição que recebo é bastante distorcida. Escolhendo um milhão de números, nem um só fica acima de 1/2 . Por algum esforço eu calculei o pdf, e não é legal.

Aqui está o pdf estranho que eu tenho para 5 variables:

insira a descrição da imagem aqui

Você tem uma idéia de um algoritmo legal para escolher os números, que resultam em uma distribuição mais uniforme ou simples?

Você está olhando para particionar a distância de 0 a 1.

Escolha n – 1 números de 0 a 1, ordene – os e determine as distâncias entre cada um deles.

Isso particionará o espaço de 0 a 1, o que deve render um grande resultado ocasional que você não está obtendo.

Mesmo assim, para valores grandes de n, você geralmente pode esperar que seu valor máximo diminua também, não tão rapidamente quanto seu método.

Você pode estar interessado na distribuição Dirichlet que é usada para gerar quantidades que summ 1 se você está procurando por probabilidades. Há também uma seção sobre como gerá-los usando distribuições gama aqui .

Outra maneira de obter n números randoms que summ 1:

 import random def create_norm_arr(n, remaining=1.0): random_numbers = [] for _ in range(n - 1): r = random.random() # get a random number in [0, 1) r = r * remaining remaining -= r random_numbers.append(r) random_numbers.append(remaining) return random_numbers random_numbers = create_norm_arr(5) print(random_numbers) print(sum(random_numbers)) 

Isso aumenta a probabilidade de números mais altos.

    Intereting Posts