繁体   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