arc4random_uniform 实现一个简单的概率算法

Oct 28, 2022 • 预计阅读时间 1 分钟

arc4random_uniform 是 C 标准库中提供的随机数生成方法,定义在头文件 stdlib.h 中。

arc4random_uniform(n); 可以生成 [0, n) 的随机整数。

概率是指一个随机事件的发生几率,比如说有标号为 0 到 9 的 10 个小球,闭着眼睛随机拿出来一个,那么拿到 0 号或者 1 号的概率是 20%,因为两个球占总数量的比例就是 20%。

基于以上结论,就可以写出一个简单概率算法。

要求:做一个抽奖程序,抽到 A 或者 B 的概率都是 10%,抽到 C 的概率是 20%:

uint32_t n = arc4random_uniform(100);

// [0, 19]
if (n < 20) {
    // 触发了一个概率为 20% 的事件
}
// [20, 29]
else if (n >= 20 && n < 30) {
    // 触发了一个概率为 10% 的事件
}
// [30, 39]
else if (n >= 30 && n < 40) {
    // 触发了另一个概率为 10% 的事件
}
// 啥也没有抽到
else {
    // 感谢参与
}

如果觉得 [0, 99) 的随机池子太小,相应的扩大上限就行。

如何验证以上概率算法?

#include <iostream>

int main(int argc, const char * argv[]) {
    uint32_t count = 0, total = 1000000;
    for (uint32_t i = 0; i < total; i++) {
        uint32_t n = arc4random_uniform(100);
        if (n < 20) {
            count += 1;
        }
    }
    
    std::cout << count << "/" << total << std::endl;
    
    return 0;
}

随机 100 万次,其中 0 到 19 出现的次数在 20 万左右。

C++
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

Mac 平台上常见的的包管理器的缓存位置

安装 Windows 11 时绕过 TPM 检查