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

标签 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 高。

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

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

最佳答案

像这样:

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/

相关文章:

c - 使用指向数组元素的指针比通过索引访问元素慢吗?

c - Erlang:是否有与 C 预处理器 ## 指令等效的指令?

c - 具有多个客户端 C/unix 的简单 TCP 服务器

R:我如何重复模拟多少次尝试才能以 1/10 的机会成功? (并记录尝试了多少次?)

python - 从python列表中选择两个数字,其概率随着它们之间的相对距离而衰减

c - 递归中的 Big Theta

c++ - C/C++中随机数生成器的实现

android - 在 SQLite 中选择有限制的随机行

Excel VBA : SQL Query to Return n Rows in Random Order

python - 从给定序列构建 N 阶马尔可夫转移矩阵