如何高效生成满足欧氏距离约束的U(-1,1)均匀分布1D随机点对
高效生成满足距离约束的1D均匀分布点对
你当前使用的拒绝采样方案逻辑正确,但当dist远小于采样区间长度(本题默认区间长度为2,dist=0.001)时,绝大多数采样结果都会被丢弃,运行效率极低,最坏情况需要循环数千次才能得到符合要求的点对。
针对1D场景可以直接实现无拒绝的O(1)效率采样,和原方案得到的点对分布完全一致,逻辑如下:
- 第一步:从U(low_, high_)中独立采样第一个点x
- 第二步:计算第二个点y的合法采样区间:左边界为
max(low_, x - dist),右边界为min(high_, x + dist),保证y既满足和x的距离≤dist,又不会超出指定采样范围 - 第三步:在上述合法区间内均匀采样得到y即可
优化后的实现代码:
import numpy as np def point_pair(low_=-1, high_=1, dist=0.001): # 边界处理:如果阈值大于区间总长度,所有点对都符合要求 if dist >= high_ - low_: x = np.random.uniform(low=low_, high=high_) y = np.random.uniform(low=low_, high=high_) return x, y # 采样第一个点 x = np.random.uniform(low=low_, high=high_) # 计算第二个点的合法采样区间 y_low = max(low_, x - dist) y_high = min(high_, x + dist) # 采样第二个点 y = np.random.uniform(low=y_low, high=y_high) return x, y
该方案没有任何循环和拒绝逻辑,不管dist多小都能单次采样得到结果,运行效率比原方案高几个数量级。如果需要批量生成多组点对,还可以进一步做向量化优化,一次性生成所有x后批量计算y的采样区间,再批量采样得到所有y值,效率更高。
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

