Как сгенерировать список чисел с плавающей точкой в ​​порядке убывания, сумма которых равна 1? - PullRequest
0 голосов
/ 02 октября 2018

Я хочу создать список с плавающей запятой размера M, где каждый элемент в списке больше, чем остальные исходные элементы, т.е. в порядке убывания.и сумма списка должна составлять 1. и для одной и той же величины М я могу сгенерировать более одного списка, который подчиняется заданным ограничениям.

Я думаю об уравнении в следующей форме:

Xi+1 = compute([Xi,Xi-1...X0], M, Random)

Но я не могу понять степень этой функции.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Если вы хотите что-то математически предсказуемое ...

def makeDescendingUnitArray(length: int):
    if (not isinstance(length, int)) or (length < 1):
        raise ValueError("Array Length must be an int with a value of at least 1")
    if length == 1:
        return [1]
    else:
        constant = 1
        output = list()
        for x in range(length - 2):
            constant /= 2
            output.append(constant)
        return output + [2*constant/3, constant/3]

for arrayLength in range(1, 10):
    array = makeDescendingUnitArray(arrayLength)
    print(array)

Создает следующие массивы ...

[1]
[0.6666666666666666, 0.3333333333333333]
[0.5, 0.3333333333333333, 0.16666666666666666]
[0.5, 0.25, 0.16666666666666666, 0.08333333333333333]
[0.5, 0.25, 0.125, 0.08333333333333333, 0.041666666666666664]
[0.5, 0.25, 0.125, 0.0625, 0.041666666666666664, 0.020833333333333332]
[0.5, 0.25, 0.125, 0.0625, 0.03125, 0.020833333333333332, 0.010416666666666666]
[0.5, 0.25, 0.125, 0.0625, 0.03125, 0.015625, 0.010416666666666666, 0.005208333333333333]
[0.5, 0.25, 0.125, 0.0625, 0.03125, 0.015625, 0.0078125, 0.005208333333333333, 0.0026041666666666665]
0 голосов
/ 03 октября 2018

Если вы хотите математически предсказуемый однострочный, то есть такой ... (цикл, чтобы показать вам, как он выглядит)

for length in range(1, 10):
    array = [2*x/(length * (length + 1)) for x in range(length,0,-1)]
    print(sum(array), array)

Это приводит к следующему выводу.Обратите внимание, что это так же подвержено ошибкам округления с плавающей запятой, как и все другие алгоритмы.Существуют лучшие и худшие алгоритмы, но в какой-то момент все они будут иметь какую-то ошибку.

Sum: 1.0 Array: [1.0]
Sum: 1.0 Array: [0.6666666666666666, 0.3333333333333333]
Sum: 0.9999999999999999 Array: [0.5, 0.3333333333333333, 0.16666666666666666]
Sum: 0.9999999999999999 Array: [0.4, 0.3, 0.2, 0.1]
Sum: 1.0 Array: [0.3333333333333333, 0.26666666666666666, 0.2, 0.13333333333333333, 0.06666666666666667]
Sum: 0.9999999999999998 Array: [0.2857142857142857, 0.23809523809523808, 0.19047619047619047, 0.14285714285714285, 0.09523809523809523, 0.047619047619047616]
Sum: 1.0 Array: [0.25, 0.21428571428571427, 0.17857142857142858, 0.14285714285714285, 0.10714285714285714, 0.07142857142857142, 0.03571428571428571]
Sum: 1.0 Array: [0.2222222222222222, 0.19444444444444445, 0.16666666666666666, 0.1388888888888889, 0.1111111111111111, 0.08333333333333333, 0.05555555555555555, 0.027777777777777776]
Sum: 0.9999999999999999 Array: [0.2, 0.17777777777777778, 0.15555555555555556, 0.13333333333333333, 0.1111111111111111, 0.08888888888888889, 0.06666666666666667, 0.044444444444444446, 0.022222222222222223]
0 голосов
/ 02 октября 2018

хорошо, давайте выберем 10 случайных чисел от 0 до 10 и отсортируем их.Затем вычислите сумму и перестройте новый список, разделив каждый элемент на эту сумму:

import random

# create a non-normalized ascending list of numbers
lst = sorted(random.uniform(0,10) for _ in range(10))
# compute the sum
temp_sum = sum(lst)
# now divide each member by the sum to normalize the list
lst = [i/temp_sum for i in lst]

print(lst,sum(lst))

Один вывод может быть:

[0.0340212528820301, 0.05665995400192079, 0.07733861892990018,
 0.07752841352220373, 0.08556431469182045, 0.11628857362899164,      
0.11706017358757258, 0.12523809404875455, 0.14272942597136748, 
0.16757117873543856] 1.0

Сумма может быть не совсем 1 из-за плавающей запятойнеточность, но будет очень близко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...