C++ - 生成具有可配置均值 "1s to 0s"比率的随机位集的有效方法

标签 c++ math optimization random bitset

我正在寻找一种高效的方法来生成随机 std::bitset 的设定长度。我还希望能够影响 1 出现在结果中的概率,所以如果概率值设置得足够低,所有结果中只有一小部分甚至会包含 1,但仍有可能(但不太可能)导致所有 1。它将用于计算量非常大的应用程序,因此欢迎每一种可能的优化。

最佳答案

Bernoulli distribution是单个实验中 1 或 0 的概率分布。许多这样的分布式变量的总和

enter image description here

给出一个服从均值 n*p 分布的变量(二项分布)。因此,通过采用 n 概率为 1 的伯努利分布位,由 p 给出,我们得到一个大小为 n 的位集,并且np 位平均设置为 1。当然,如果这提供的效率不够,这只是下一步优化的起点。

#include <iostream>
#include <random>
#include <bitset>

template< size_t size>
typename std::bitset<size> random_bitset( double p = 0.5) {

    typename std::bitset<size> bits;
    std::random_device rd;
    std::mt19937 gen( rd());
    std::bernoulli_distribution d( p);

    for( int n = 0; n < size; ++n) {
        bits[ n] = d( gen);
    }

    return bits;
}

int main()
{
    for( int n = 0; n < 10; ++n) {
        std::cout << random_bitset<10>( 0.25) << std::endl;
    }
}

结果:

1010101001

0001000000

1000000000

0110010000

1000000000

0000110100

0001000000

0000000000

1000010000

0101010000

http://ideone.com/p29Pbz

关于C++ - 生成具有可配置均值 "1s to 0s"比率的随机位集的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25176423/

相关文章:

c++ - 监控操作码

java - 金丝桃 : How to get total of ram in GB?

javascript - Angular 的平方根

Mysql 更新之前首先检查是否有必要或只是更新?

java - 链接两个对象并逐个获取它们

c++ - 当所有类型未知时从基类重载函数

c++ - 如何使用 DSP 加速 OMAP 上的代码?

java - 用 Java 生成概率分布

c++ - std::vector<int> sum ASM 解释

c++ - 检查字符串中任何数字的最简单方法