代码之家  ›  专栏  ›  技术社区  ›  adnanmuttaleb

如何按和为1的降序生成浮点数列表?

  •  0
  • adnanmuttaleb  · 技术社区  · 7 年前

    我想生成一个m大小的浮动列表,其中列表中的每个项目都大于其他正在进行的项目,即降序。列表的和必须为1。对于相同的m量级,我可以生成多个服从给定约束的列表。

    我在想一个方程式,形式如下:

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

    但是我无法计算出这个函数的范围。提前谢谢。

    3 回复  |  直到 7 年前
        1
  •  4
  •   Jean-François Fabre    7 年前

    好吧,让我们从0到10中选择10个随机数,然后对它们进行排序。然后计算sum并重新生成一个新列表,其中每个元素除以这个和:

    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,但会非常接近。

        2
  •  2
  •   David Culbreth    7 年前

    如果你想要数学上可以预测的东西…

    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]
    
        3
  •  1
  •   David Culbreth    7 年前

    如果你想要一个数学上可预测的一行程序,那么这就是… (循环显示它的样子)

    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]
    
    推荐文章