2016-05-26 10 views
1

私はstd::bitset<32> wordを持っています。ランダムに選択し、1のビットのインデックス(0-31)を選びたいと思います。そこにはstd::algorithmが適していますか? もし簡単なら、bitsetをstringまたはintに変換し、stringまたはintに変換することができます。ここでビットセット内のセットビットのランダムな位置を選択するベストC++方法

+2

http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution – chris

+1

ありがとう、あなた。それがどのように役立つのでしょうか?すべてのビットが1ではないので、0〜31の間のすべてのインデックスが有効ではない –

+0

これはXY問題のように聞こえる。あなたは実際に何を達成しようとしていますか? – NathanOliver

答えて

2

はそれで最初に刺します:

std::bitset<32> bitset{...}; 

std::mt19937 prng(std::time(nullptr)); 
std::uniform_int_distribution<std::size_t> dist{1, bitset.count()}; 

std::size_t p = 0; 
for(std::size_t c = dist(prng); c; ++p) 
    c -= bitset[p]; 

// (p - 1) is now the index of the chosen bit. 

それはランダムで、その後c番目のセットのビットを探して、その間隔でcを選んでやって、設定ビットをカウントすることで動作します。

+0

@Quentinほとんど:D 'p'は望ましいインデックスではないと思います –

+0

@HannaKhalil' for'インクリメントは 'c'がゼロになった後もう一度' p'を実行するので、私はそれをオフセットする必要がありました。 – Quentin

関連する問題