C中的偏置随机数生成器函数

Mat*_*sel 4 c random probability

尝试在C中创建以下函数:

bool randBool(double bias)
Run Code Online (Sandbox Code Playgroud)

返回01随机返回.

绊倒我的部分是我想允许用户输入[-1.0,1.0]范围内的"偏差",这表示输出将是0或的可能性1.

以下是输入偏差应如何影响功能的几个示例:

================================================== =====

randBool(-1.0)应该0100%返回.

randBool(1.0)应该1100%返回.

randBool(-0.5)返回的可能性0比50%高1.

randBool(0.05)返回的可能性1比5%多0.

randBool(0.0)是没有更多的可能返回01.

================================================== =====

我几乎可以肯定这是一个概率问题,但我对这个主题并不熟悉,所以我对如何实现这个功能感到困惑.

San*_*ker 5

像这样的东西:

bool randBool(double bias) {
    return rand() < ((RAND_MAX + 1.0) * ((bias + 1) / 2));
}
Run Code Online (Sandbox Code Playgroud)

((bias + 1) / 2)部分是在[0,1]范围而不是[-1,1]中获得偏差.如果bias参数已更改为已在[0,1]范围内,则可以避免这种情况.

然后将偏差定义为返回1的概率.用:

  • 0.0(对应你的偏见-1.0):全零
  • 0.25(对应于你的偏见-0.5):25%,75%零
  • 0.5(对应于你的偏见0.0):甚至混合了1和0
  • 0.525(对应于你的偏见0.05):52.5%,47.5%零
  • 1.0(对应你的偏见1.0):所有的


注意事项 RAND_MAX

  • 如果RAND_MAX < INT_MAX,则RAND_MAX + 1可以代替使用RAND_MAX + 1.0.

  • 如果RAND_MAX + 1.0不能用a double舍入(ref.是否所有整数值都完美地表示为双精度?),那么所提出的解决方案是不可靠的.
    在这样的平台上的方法可以是将结果重新缩放rand()到可以由a int或a 表示的范围double(取决于你是否使用RAND_MAX + 1RAND_MAX + 1.0).
    或者,使用不同的随机数生成器(没有这个问题),无论如何,这可能是一个好主意,因为rand()那里有许多低质量的实现.