我想在 [0,1] 之間生成 30 個具有正態分布形狀的亂數,并且我希望它們的總和等于 1。
uj5u.com熱心網友回復:
我不完全知道“正態分布的形狀”或“總和等于 1”是什么意思,但你可以試試這個:
from random import randint
numbers = []
for i in range(30):
numbers.append(randint(0, 1))
print(numbers)
(我的)輸出:
[1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0]
它可能不是最好或最干凈的代碼,但它可以作業。
uj5u.com熱心網友回復:
不需要 numpy,您只需要import random并使用random.uniform,但對于更大的代碼庫,您可以這樣做:
import numpy
## step 1: generating a list of 29 pseudo random numbers between 0.0 and 1.0
array = numpy.random.random_sample(size=29)
## step 2: ensuring the sum of that list will not be higher than 1.0
while(sum(array) > 1.0):
for i,a in enumerate(array):
array[i] = a * 0.9
## step 3: appending the last number to the list such as the sum will be exactly 1.0
array = numpy.append(array, (1.0 - sum(array)))
print(f"the sum of elements is {sum(array)}")
print(f"the elements: {str(array)}")
這樣做是生成一個由 29 個介于 0.0 和 1.0 之間的隨機陣列成的陣列,它的總和顯然會高于 1.0,因為總和范圍是 ~0.0-29.0。
while 回圈會將每個數字乘以 0.9,使它們更接近 0.0,因此將總和降低到低于 1.0
那么最后一個數字就是 1.0 與其他 29 個數字的當前總和之間的差,總共是 30 個偽亂數。最后一個和其他 29 個一樣隨機,因為它是由所有這些決定的。
高斯演算法的實作留給讀者作為練習。
uj5u.com熱心網友回復:
您必須從具有固有 sum=1 屬性的分布中采樣。這稱為狄利克雷分布。它總是正確地總和為 1。平均值顯然是 1/30,但是如果你想在平均值周圍有尖峰,增加 alpha 引數,方差將是 ~1/alpha
順其自然(未經測驗!)
import numpy as np
N = 30
alpha = N*[10] # or make it 20 for sharper peak, or 30, or ...
q = np.random.dirichlet(alpha)
print(q)
print(np.sum(q))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464375.html
