我需要[LB,UB]
在 C++ 的区间内从整数的均匀分布中随机抽样。为此,我从一个“好”的 RN 生成器(来自 Numerical Recipes 3rd ed.)开始,它均匀地随机采样 64 位整数;让我们称之为int64()
。
使用 mod 运算符,我可以通过以下方式从整数中采样[LB,UB]
:
LB+int64()%(UB-LB+1);
使用 mod 运算符的唯一问题是整数除法的速度很慢。所以,我然后尝试了这里建议的方法,即:
LB + (int64()&(UB-LB))
按位 & 方法的速度大约是 3 倍。这对我来说是巨大的,因为我在 C++ 中的一个模拟需要随机采样大约 2000 万个整数。
但是有1个大问题。当我分析使用按位 & 方法采样的整数时,它们在区间上看起来并不均匀分布[LB,UB]
。整数确实是从 中采样的[LB,UB]
,但仅从该范围内的偶数中采样。例如,这是使用按位 & 方法从 [20,50] 采样的 5000 个整数的直方图:
相比之下,使用 mod 运算符方法时类似的直方图看起来像这样,当然效果很好:
我的按位 & 方法有什么问题?有没有办法修改它,以便在定义的间隔内对偶数和奇数进行采样?