Google搜索显示了大量关于将整数n的所有可能的分区生成为m个部分的信息,但是我还没有发现将n的均匀分布的随机分区采样为m个部分的任何信息。
这是执行此操作的一些代码。第一次调用时为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 个分区。