尝试在 C 中创建以下函数:
bool randBool(double bias)
随机返回 0
或 1
。
让我感到困惑的部分是我想允许用户输入 [-1.0, 1.0] 范围内的“偏差”,这表示输出为 0< 的可能性
或 1
。
以下是输入偏差应如何影响函数的几个示例:
============================================= ========
randBool(-1.0)
应该在 100% 的时间内返回 0
。
randBool(1.0)
应该在 100% 的时间内返回 1
。
randBool(-0.5)
返回 0
的可能性比 1
高 50%。
randBool(0.05)
返回 1
的可能性比 0
高 5%。
randBool(0.0)
返回 0
的可能性并不比 1
高。
============================================= ========
我几乎可以肯定这是一个概率问题,但我对这个话题不太熟悉,所以我对如何实现这个功能感到困惑。
最佳答案
像这样:
bool randBool(double bias) {
return rand() < ((RAND_MAX + 1.0) * ((bias + 1) / 2));
}
((bias + 1) / 2)
部分是获得 [0,1] 范围内的偏差,而不是 [-1,1]。这可以避免,如果 bias
参数更改为已在 [0,1] 范围内。
然后将偏差定义为返回 1 的概率。与:
-
0.0
(对应于你的偏见-1.0
):全零 -
0.25
(对应于你的偏见-0.5
):25% 1,75% 0 -
0.5
(对应于你的偏见0.0
):即使是 1 和 0 的混合 -
0.525
(对应于你的偏见0.05
):52.5% 1,47.5% 0 -
1.0
(对应你的偏见1.0
):全部
关于 RAND_MAX
的注释
如果
RAND_MAX < INT_MAX
, 然后RAND_MAX + 1
可以用来代替RAND_MAX + 1.0
.如果
RAND_MAX + 1.0
不能用double
表示如果没有四舍五入(引用 Are all integer values perfectly represented as doubles? ),那么所提出的解决方案是不可靠的。
在此类平台上的一种方法可能是重新调整rand()
的结果。到可以用int
表示的范围或double
(取决于您使用的是RAND_MAX + 1
还是RAND_MAX + 1.0
)。
或者,使用不同的随机数生成器(没有这个问题),考虑到rand()
的许多低质量实现,这可能是个好主意。在那里。
关于c - C中的偏置随机数生成器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52480128/