zoukankan      html  css  js  c++  java
  • 数据随机分配的思考

    现在我有一批数据,想随机分成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
  • 相关阅读:
    原型,构造函数,实例,__proto__
    To me
    那么再会吧!OI!(HNOI2019退役记)
    中山纪念中学培训杂题(难的都不在这里面qwq)
    关于菜鸡我
    树链剖分讲解
    [luogu] P4823 [TJOI2013]拯救小矮人(贪心)
    [luogu] P4551 最长异或路径(贪心)
    [luogu] P4364 [九省联考2018]IIIDX(贪心)
    [luogu] P4155 [SCOI2015]国旗计划(贪心)
  • 原文地址:https://www.cnblogs.com/wbjxxzx/p/11609868.html
Copyright © 2011-2022 走看看