C++ - 生成随机位集的有效方法,具有可配置的平均“1 与 0”比率

2024-04-07

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


伯努利分布 http://en.wikipedia.org/wiki/Bernoulli_distribution是单个实验中 1 或 0 的概率分布。许多此类分布变量的总和

给出一个均值分布的变量n*p(二项分布)。所以通过采取n伯努利分布比特的概率为1给出的p我们得到一个大小的位集n and 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;
    }
}

result:

1010101001

0001000000

100亿

0110010000

100亿

0000110100

0001000000

0000000000

1000010000

0101010000

http://ideone.com/p29Pbz http://ideone.com/p29Pbz

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ - 生成随机位集的有效方法,具有可配置的平均“1 与 0”比率 的相关文章

随机推荐