有效地在开放区间(0,1)上生成随机数

aud*_*tic 5 c random algorithm random-sample intervals

我正在寻找一种在开放区间(0,1)上生成随机浮点数的有效方法.我目前有一个RNG,它在闭合闭合间隔[0,(2 ^ 32)-1]上生成随机整数.我已经在区间[0,1)上创建了一个半开浮点RNG,只需将整数RNG的结果乘以1 /((2 ^ 32)-1)而不是除以(2 ^ 32) -1因为它效率低下.

我目前在间隔(0,1)上生成数字的方式是使用如下所示的条件语句:

float open_open_flt = (closed_open_flt==0) ? closed_open_flt : FLT_MIN; 
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是非常低效的,因为它是控制代码,我觉得它引入了一些偏见.

任何人都可以提出替代方案吗?

PA.*_*PA. 4

你已经在那里了。

当前生成器产生的两个浮点数之间的最小距离是 1/(2^32)。

因此,您的生成器有效地生成[0,1-1/(2^32)]

1/(2^32) 大于 FLT_MIN。

因此,如果将 FLT_MIN 添加到生成器中,

float open_open_flt = FLT_MIN + closed_open_flt;
Run Code Online (Sandbox Code Playgroud)

你会得到[FLT_MIN,1-(1/(2^32))+FLT_MIN],它作为(0,1)生成器工作。