| 
                         | 
                    
                              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位整数缩放,无溢出 7 年前 | 
| 
                         | 
                    Benn Tan · 比特操作:更难翻动硬币 7 年前 | 
| 
                         | 
                    Ganesh Thampi · 使用位运算符将十进制转换为二进制 7 年前 | 
| 
                         | 
                    Ganesh Thampi · 使用位的奇偶程序 7 年前 | 
| 
                         | 
                    datapanda · 三维网格的莫顿反向编码 7 年前 | 
| 
                         | 
                    rubyquartz · 交换无符号短整数的字节 7 年前 | 
| 
                         | 
                    John Proctor · C中位的掩蔽范围 7 年前 | 
| 
                         | 
                    Areg Sarvazyan · 从无符号int中提取位的函数 7 年前 | 
| 
                         | 
                    user9505617 · 按位异或0xFFFFFFFF? 7 年前 |