【发布时间】:2018-05-09 14:03:56
【问题描述】:
我有兴趣在 C 中生成快速随机布尔值(或等效的 Bernoulli(0.5) 随机变量)。当然,如果有一个具有良好统计行为的快速随机生成器,那么问题“对随机 Bernoulli(0.5) 进行采样” " 很容易解决:在 (0,1) 中均匀采样x,如果x<0.5,则返回1,否则返回0。
假设速度是最重要的,现在我有两个问题/考虑:
-
许多随机双精度数生成器首先在一定范围内统一生成整数
m[0,M],然后简单地返回除法m/M。只检查m < M/2是否会更快(这里M/2是固定的,所以我们节省了一个部门)- 有更快的方法吗?最后,我们在这里要求的统计属性要少得多:我们可能仍然对很长一段时间感兴趣,但是,例如,我们不关心分布的均匀性(只要大约 50% 的值在范围的前半部分)。
【问题讨论】:
-
你的问题是如何写或者在哪里可以找到这样的东西?
-
对于随机布尔值,
clock()&1就足够了。 -
(1) 您可以只进行概要分析和比较。 (2) 假设一个完美的输入 RNG,你可以从每个随机整数中提取 32 个(或任何你的单词大小)随机布尔值。
-
只需使用您平台上可用的 random 函数(
rand、random、arc4random等)并保留返回值的一位. -
生成一个无符号的 64 位整数并将这些位用作布尔值。这就像在 1 次中生成 64 个布尔值。
标签: c performance random boolean