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 万左右。