[英]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.