我正在寻找一种在开-开区间 (0,1) 上生成随机 float 的有效方法。我目前有一个 RNG,它在 [0, (2^32)-1] 的闭区间生成随机整数。我已经通过简单地将整数 RNG 的结果乘以 1/((2^32)-1) 而不是除以 (2^32),在区间 [0,1) 上创建了一个半开浮点 RNG -1 因为它效率低下。
我目前在区间 (0,1) 上生成数字的方法是使用如下所示的条件语句:
float open_open_flt = (closed_open_flt==0) ? closed_open_flt : FLT_MIN;
不幸的是,这是相当低效的,因为它是控制代码,我觉得它引入了一些偏差。
谁能提出替代方案?
最佳答案
你已经在那里了。
当前生成器生成的两个 float 之间的最小距离是 1/(2^32)。
因此,您的生成器正在有效地生成 [0,1-1/(2^32)]。
1/(2^32) 大于 FLT_MIN。
因此,如果您将 FLT_MIN 添加到生成器,
float open_open_flt = FLT_MIN + closed_open_flt;
您将获得 [FLT_MIN,1-(1/(2^32))+FLT_MIN],它用作(0,1) 生成器。
关于c - 有效地在开-开区间 (0,1) 上生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17955007/