簡體   English   中英

將整數拆分為浮點數

[英]Split whole number into float numbers

目標:將100分成5隨機的 2 個小數位數字。

到目前為止,我可以模擬任意數量的部門。

然而,這些只是整數並且是“平衡的”,因為它們的值彼此相同或接近。 因此,output 始終相同。

代碼:

def split(x, n):
 
    if(x < n):
        print(-1)
 
    elif (x % n == 0):
        for i in range(n):
            print(x//n, end =" ")
    else:
        zp = n - (x % n)
        pp = x//n
        for i in range(n):
            if(i>= zp):
                print(pp + 1, end =" ")
            else:
                print(pp, end =" ")
       
split(100, 5)
>>> 20 20 20 20 20 

所需的 Output:

  • 號碼列表,
  • 浮點數(2 dp),
  • 不平衡。

所需的示例 Output:

[10.50, 22.98, 13.23, 40.33, 12.96]

如果您從第一個的完整范圍、第二個的剩余范圍、第三個的剩余范圍等開始統一生成值,則每次有 50% 的機會獲得大於剩余范圍一半的值. 這會導致系統偏差——平均而言,較早的值往往大於較晚的值。 有一個簡單的算法可以避免這種情況並為所有位置獲得相同的分布:

  1. 生成一個包含 0 和最大值的列表,然后 append n-1 個值都均勻分布在 0 和最大值之間;
  2. 對列表進行排序;
  3. 計算排序列表中相鄰值對之間的差異。

根據定義,結果將加起來為最大值,因為它們是 0 和最大值之間的間隔長度。 大間隙或小間隙同樣可能落在任何對之間,保證相同的分布(在 PRNG 實際上是均勻的范圍內)。

我采用了按比例放大 100 並返回到小數點后兩位的想法。 這是代碼:

import random

def split(x, n, decimal=2):
    if x < n: return -1
    if decimal < 0: return -1

    x *= 10**decimal

    numbers = [0, x]
    for _ in range(n - 1):
        number = random.randint(1, x)
        numbers.append(number)
    numbers.sort()

    return [(numbers[i] - numbers[i-1]) / 10**decimal for i in range(1, n+1)]

這會產生諸如

[10.82, 12.97, 17.92, 39.46, 18.83]
[25.99, 21.35, 29.12, 8.13, 15.41]
[5.51, 4.28, 69.59, 9.62, 11.0]
[21.39, 20.96, 11.25, 15.07, 31.33]

您可以使用 python 的內置random庫來指定隨機數,並不斷從總數中減去該數字以生成更多隨機數。

就像@Kenny Ostrom 建議的那樣,您可以乘以 100,然后在最后除以 100 以獲得所需的小數位數。 我通過添加一個 kwarg decimal使它更通用,以防您需要不同的浮點精度

import random

def split(x, n, decimal=2):
    if x < n: return -1
    if decimal < 0: return -1

    x *= 10**decimal

    numbers = []
    left = x
    for i in range(n):
        number = random.randint(1,left)
        numbers.append(number)
        left -= number

    return [n / 10**decimal for n in numbers]

一些示例輸出

split(100,5) # [1.8, 67.64, 0.51, 21.88, 3.67]
split(100,5) # [29.29, 16.39, 51.54, 1.91, 0.71]
split(100,5) # [95.24, 0.79, 0.82, 2.56, 0.02]
split(100,5) # [10.18, 45.09, 30.87, 0.3, 0.68]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM