1
4
首先是一些你已经在代码中使用的难看的数学。 定义x和y是概率分别为x=p(x=1)、y=p(y=1)的1位。 那我们就有了
如果我们让y=1/2,我们得到
现在把rhs设为我们想要的概率,我们有两个例子可以解x
接下来,我们假设我们可以再次利用这个,得到x的另一个变量z… 然后我们继续迭代,直到完成“足够”为止。 这有点不清楚,但考虑到p=0.375
因此,我们可以通过x1&(x2_x3)得到p=0.375的变量。 问题是,对于大多数变量,这不会终止。例如
因此p=0.333可由
现在我怀疑在这个系列中使用足够多的术语会给你足够的准确性,并且这可以写成一个递归函数。不过,也许还有更好的办法…我认为操作的顺序与p的二进制表示有关,我只是不确定如何…也没有时间深入思考。 无论如何,这是一些未经测试的C++代码。您应该能够轻松地实现它。
|
2
2
通过数字按比例分配位数。 Pseudocode:
我希望你明白我的意思。也许
|
3
1
使用在0和1之间生成统一浮点数r的随机生成器。如果R>P,则将位设置为0,否则将其设置为1。 |
4
1
如果你想应用一些分布,其中概率p为1,概率1-p为0,你的最佳选择就是独立生成每一个比特,概率p为1(我知道,这听起来像是一个递归定义)。 这里有一个解决方案,我将在下面介绍它:
基本上,我们首先确定如何用概率p生成1的值:
|
5
1
这是另一个变种 Michael Anderson's answer 为了避免递归,我们从右到左迭代处理p的位,而不是从左到右递归处理。这在浮点表示中很难做到,因此我们从二进制表示中提取指数/尾数字段。
|
6
1
这就是我最终解决问题的方法。
这在一定程度上是受Ondra_½I_¾Ka回答的启发。
好处是它减少了
当然,计算二项式概率也同样昂贵,所以这些都放在另一个查找表中。 这是很多代码,但在性能方面是值得的。
更新
-将其与按位和/或解决方案合并。它现在使用这个方法,如果它猜测它将更有效(在调用
|
7
0
假设位数组的大小是l,如果l=1,第一个位为1的概率是p,0的概率是1-p,对于l=2,得到00的概率是(1-p) 二 ,01或10表示P(1-P),11表示P 二 . 扩展这个逻辑,我们可以首先通过比较随机数和p来确定第一个位,然后缩放随机数,这样我们可以再次得到0到1之间的任何值。示例javascript代码:
编辑: 此代码确实生成完全随机的位。我会尽力更好地解释这个算法。 每个位串都有一定的发生概率。假设一个字符串有发生的概率 磷 ;如果我们的随机数是长度p的某个区间,我们希望选择该字符串。该区间的起始点必须是固定的,但其值不会有太大的差别。假设我们正确地选择了最多k位。然后,对于下一个位,我们将这个k长度位串对应的间隔分成两部分大小,比例为 p:1 - 磷 (这里 磷 是得到1的概率)。我们说,如果随机数在第一部分,下一位将是1;如果随机数在第二部分,下一位将是0。这确保长度为k+1的字符串的概率也保持正确。 Java代码:
|
no one special · 32位整数缩放,无溢出 6 年前 |
Benn Tan · 比特操作:更难翻动硬币 6 年前 |
Ganesh Thampi · 使用位运算符将十进制转换为二进制 6 年前 |
Ganesh Thampi · 使用位的奇偶程序 6 年前 |
datapanda · 三维网格的莫顿反向编码 6 年前 |
rubyquartz · 交换无符号短整数的字节 6 年前 |
John Proctor · C中位的掩蔽范围 6 年前 |
Areg Sarvazyan · 从无符号int中提取位的函数 6 年前 |
user9505617 · 按位异或0xFFFFFFFF? 6 年前 |