小编典典

如何生成统一的随机整数分区?

algorithm

Google搜索显示了大量关于将整数n的所有可能的分区生成为m个部分的信息,但是我还没有发现将n的均匀分布的随机分区采样为m个部分的任何信息。


阅读 306

收藏
2020-07-28

共1个答案

小编典典

这是执行此操作的一些代码。第一次调用时为O( n 2),但是它将建立一个缓存,以便后续调用为O( n )。

import random

cache = {}

def count_partitions(n, limit):
    if n == 0:
        return 1
    if (n, limit) in cache:
        return cache[n, limit]
    x = cache[n, limit] = sum(count_partitions(n-k, k) for k in range(1, min(limit, n) + 1))
    return x

def random_partition(n):
    a = []
    limit = n
    total = count_partitions(n, limit)
    which = random.randrange(total)
    while n:
        for k in range(1, min(limit, n) + 1):
            count = count_partitions(n-k, k)
            if which < count:
                break
            which -= count
        a.append(k)
        limit = k
        n -= k
    return a

工作原理: 我们可以计算O( n 2)时间中整数 n的 分区数。副作用是,这将生成一个大小为O( n
2)的表,然后我们可以使用该表在O( n )时间内针对任何整数 k 生成 n的k 个分区。

因此,让 total =分区数。从0到 总数中 选择一个随机数 k -1.生成第 k 个分区。

2020-07-28