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

标签 c algorithm intervals random

我正在寻找一种在开-开区间 (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/

相关文章:

java - 这是什么最短路径迷宫算法?

javascript - 一个字符串可以有一个回文,有没有更好的方法来做到这一点?

algorithm - 推箱子游戏 : move boxes automatically

algorithm - 将双舍入到算术级数的最近成员?

java - 如何在开区间 (x, y) 上获得下一个随机 double 值

arrays - `int *p` 和 `int (*p)[3]` 之间的区别?

c - stat 系统调用的 st_mode 标志

c - "int b = (int) 45.0"和 "int b = 45.0"和有什么区别?

c - 从 sysctl.h 实现 GetBSDProcessList

javascript - 背景图像更换间隔Javascript