数据随机分配的思考

现在我有一批数据,想随机分成N份,每份的数据量要随机,该如何实现呢?

选择随机数

要随机分成N份,那么先选择一个随机数,比如在区间 1~100 选择,可以使用 random.randint(1,100)

如何保证每份的数据也随机分配呢?
如果我第一次随机取出一批,第二次在剩下的数据里继续进行此操作,第三次同样。。。一直到第N次

写成递推公式就是:

  • f(n) = Number (n=1)
  • f(n) = f(Number, f(n-1)) (n>1)

代码实现如下:

import random
# 存放每次分到的数据
result = []

def rand_allocate(val, n):
    if n == 1:
        result.append(val)
        return
    # 每次分到的数据至少为1  所以在 1 ~ val-n+1 间随机选择
    choice = random.randint(1, val-n+1)
    # 计算剩下的数据
    val -= choice
    result.append(choice)
    rand_allocate(val, n-1)

# rand_allocate(999, 5)
# print(result)
# print(sum(result))

数据段方式

随机分成N份,可以看作在 0 ~ VALUE 的线段上取N个线段,即在 0 ~ VALUE 间随机取 N-1 个点
代码实现如下:

def rand_choice(val, n):
    # 在 1 ~ val-1 间随机 n-1 个点
    choices = [random.randint(1, val-1) for i in range(n-1)]
    # 排序后插入 0 和 val
    choices.sort()
    choices.insert(0, 0)
    choices.append(val)
    # 计算线段长度
    result = [choices[i]-choices[i-1] for i in range(1, len(choices))]
    return result

进一步推广:

  • 随机取出N个数,使得和为一个固定值
  • 随机选取比例,使得比例总和为1
posted @ 2019-09-29 20:22  葡萄不吐皮  阅读(692)  评论(0编辑  收藏  举报