[英]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:
所需的示例 Output:
[10.50, 22.98, 13.23, 40.33, 12.96]
如果您從第一個的完整范圍、第二個的剩余范圍、第三個的剩余范圍等開始統一生成值,則每次有 50% 的機會獲得大於剩余范圍一半的值. 這會導致系統偏差——平均而言,較早的值往往大於較晚的值。 有一個簡單的算法可以避免這種情況並為所有位置獲得相同的分布:
根據定義,結果將加起來為最大值,因為它們是 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.