尝试在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
。
================================================ ========
我几乎可以肯定这是一个概率问题,但是我对该主题不太熟悉,因此我对如何实现此功能感到困惑。
答案 0 :(得分:5)
类似这样的东西:
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
):甚至是一和零的组合0.525
(对应于您的偏见0.05
):52.5%的1,47.5%的零点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
表示的范围(取决于您是否使用{{ 1}}或RAND_MAX + 1
)。
或者,也可以使用其他随机数生成器(不存在此问题),考虑到RAND_MAX + 1.0
的许多低质量实现,这可能还是个好主意。