数据随机分配的思考
现在我有一批数据,想随机分成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