• 数据随机分配的思考


    现在我有一批数据,想随机分成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
  • 相关阅读:
    那些年,我还在学习asp.net(二)
    那些年,我还在学ADO.NET
    那些年,我还在学css
    数据库存储过程游标函数
    数据库视图索引触发器
    那些年,我还在学asp.net(一)
    向SQL2005中导入.dbf文件中的数据
    那些年,我还在学习html
    CMenu遍历
    网站记载
  • 原文地址:https://www.cnblogs.com/wbjxxzx/p/11609868.html
Copyright © 2020-2023  润新知