如何生成区间内各点被包含概率均等的均匀分布非空整数子区间?
如何生成满足每个点被包含概率相等的随机整数子区间
你原来的方法之所以会出现分布不均,是因为不同的子区间被选中的概率不一致:当c靠近区间左端时,可选的d更多,每个对应的(c,d)对被选中的概率更低;而c靠近中间时,可选的d更少,每个(c,d)对被选中的概率更高,最终导致区间中间的点被包含的次数远多于两端的点。
下面分两种核心需求给出解决方案:
情况1:生成均匀分布的非空子区间
如果你实际需求是让所有可能的非空子区间等概率被选中(这是最常见的「子区间均匀分布」定义),可以通过以下方式实现:
先生成两个独立的均匀随机整数X和Y,范围是[a, b)。如果X等于Y,就重新采样;否则取c为X和Y中的较小值,d为较大值。这样每个非空子区间[c,d)被选中的概率完全相等。
代码示例:
import numpy as np import matplotlib.pyplot as plt a = -100 b = 100 N = 10000 cs = [] ds = [] while len(cs) < N: x = np.random.randint(a, b) y = np.random.randint(a, b) if x != y: c = min(x, y) d = max(x, y) cs.append(c) ds.append(d) # 统计验证 hist = np.zeros(b - a, int) for c, d in zip(cs, ds): hist[c - a:d - a] += 1 plt.plot(np.arange(a, b), hist) plt.show()
这种方法生成的直方图依然会呈现中间高、两端低的形状,这是正常现象——所有子区间均匀分布时,中间的点会被更多子区间包含,因此被采样到的次数自然更多。
情况2:让每个点被包含的概率相等
如果你的核心需求确实是让区间内每个点被包含在子区间中的概率完全相等,需要调整子区间长度的采样概率:长度越短的子区间,被选中的概率越高(与长度成反比)。具体步骤如下:
- 计算区间长度
L = b - a,以及第L个调和数H_L = 1 + 1/2 + 1/3 + ... + 1/L。 - 按概率
P(l) = 1/(l*H_L)采样子区间长度l(l的范围是1到L)。 - 对于选中的长度
l,均匀采样起始点c(范围是[a, b - l]),则d = c + l。
代码示例:
import numpy as np import matplotlib.pyplot as plt a = -100 b = 100 N = 10000 L = b - a # 计算调和数H_L H_L = sum(1 / l for l in range(1, L+1)) # 生成长度l的概率分布 lengths = np.arange(1, L+1) probabilities = 1 / (lengths * H_L) # 采样N个长度 ls = np.random.choice(lengths, size=N, p=probabilities) # 采样对应的起始点c cs = np.array([np.random.randint(a, b - l) for l in ls]) ds = cs + ls # 统计验证 hist = np.zeros(L, int) for c, d in zip(cs, ds): hist[c - a:d - a] += 1 plt.plot(np.arange(a, b), hist) plt.show()
这种方法生成的直方图会接近一条水平线,满足每个点被包含的概率相等的要求。
内容的提问来源于stack exchange,提问作者yuri kilochek
相关产品推荐
相关产品推荐

