Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Boost 如何在动态位集中找到随机位1(或0)?_Boost - Fatal编程技术网

Boost 如何在动态位集中找到随机位1(或0)?

Boost 如何在动态位集中找到随机位1(或0)?,boost,Boost,如何在动态\u位集中查找随机位1(或0) 示例: bitset: 101101 index : 012345 find_random_bit_1() return 3 find_random_bit_0() return 4 最简单的方法是不断选择位,直到找到要查找的位: template <typename T, typename Alloc, typename Rnd = boost::mt19937> size_t select_random_bit(boost::dyna

如何在
动态\u位
集中查找随机位1(或0)

示例

bitset: 101101
index : 012345

find_random_bit_1() return 3
find_random_bit_0() return 4

最简单的方法是不断选择位,直到找到要查找的位:

template <typename T, typename Alloc, typename Rnd = boost::mt19937>
size_t select_random_bit(boost::dynamic_bitset<T, Alloc> const& bs, Rnd& random, bool target = true) {
    boost::uniform_int<size_t> pick(0,bs.size()-1);

    if (bs.empty() || (bs.all() && !target) || (bs.none() && target))
        throw std::range_error("select_random_bit");

    while(true) {
        auto index = pick(random);
        if (bs[index] == target)
            return index;
    }

    throw std::logic_error("select_random_bit");
}

谢谢我找到了自己的路。我生成一个随机索引
c++//查找随机位std::uniform\u int\u distribution dist(0,a\u bit\u set.count()-1);自动随机位索引=0;随机位索引=距离(mt);if(!a_bit_set.test(random_bit_index)){random_bit_index=a_bit_set.find_next(random_bit_index);}if(random_bit_index==dynamic_bit set::npos){random_bit_index=a_bit_set.find_first()}
但我会试试你的方法。我认为这样更好(y)
#include <boost/dynamic_bitset.hpp>
#include <boost/random.hpp>
#include <iostream>
#include <stdexcept>

template <typename T, typename Alloc, typename Rnd = boost::mt19937>
size_t select_random_bit(boost::dynamic_bitset<T, Alloc> const& bs, Rnd& random, bool target = true) {
    boost::uniform_int<size_t> pick(0,bs.size()-1);

    if (bs.empty() || (bs.all() && !target) || (bs.none() && target))
        throw std::range_error("select_random_bit");

    while(true) {
        auto index = pick(random);
        if (bs[index] == target)
            return index;
    }

    throw std::logic_error("select_random_bit");
}

boost::dynamic_bitset<> generate_testdata(boost::mt19937& rng) {
    boost::dynamic_bitset<> bs(1024+rng()%1024); // [1024,2048) bits

    boost::uniform_smallint<uint8_t> gen(0, 1);
    for(size_t i = 0; i < bs.size(); ++i)
        bs[i] = gen(rng);

    return bs;
}

int main() {
    using namespace boost;

    mt19937 rng(42); // seed it
    auto data = generate_testdata(rng);

    std::cout << data.count() << " out of " << data.size() << " bits are set\n";

    std::cout << "\nTrue: ";
    for (int i = 0; i <10; ++i)
        std::cout << select_random_bit(data, rng/*, true*/) << " ";

    std::cout << "\nFalse: ";
    for (int i = 0; i <10; ++i)
        std::cout << select_random_bit(data, rng, false) << " ";
}
562 out of 1126 bits are set

True: 1104 394 684 716 624 492 102 817 392 616 
False: 335 589 971 785 1069 948 865 290 51 652