C

时间:2018-09-24 13:03:07

标签: c random probability

尝试在C中创建以下功能:

bool randBool(double bias)

随机返回01

让我不满意的部分是,我希望允许用户输入[-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

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

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

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()的结果重新缩放到可以由intdouble表示的范围(取决于您是否使用{{ 1}}或RAND_MAX + 1)。
    或者,也可以使用其他随机数生成器(不存在此问题),考虑到RAND_MAX + 1.0的许多低质量实现,这可能还是个好主意。