2016-05-26 7 views
1

zu wählen Ich habe std::bitset<32> word und ich möchte nach dem Zufallsprinzip und Index (0-31) von einem Bit, das ist 1. Wie kann ich das ohne Schleifen und Zähler. Gibt es dafür eine std::algorithm? Wenn es einfacher ist, kann ich die bitset in Zeichenfolge oder int konvertieren und es auf der Zeichenfolge oder Int.Best C++ Weg zufällig Position des gesetzten Bits in Bitset

+2

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

+1

Danke chris. aber wie hilft das? Nicht alle Bits sind 1, daher sind nicht alle Indizes zwischen 0 und 31 gültig. –

+0

Das klingt nach einem XY-Problem. Was versuchst du eigentlich zu erreichen? – NathanOliver

Antwort

2

Hier ist ein erster Stab an sie:

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. 

Es funktioniert durch die gesetzten Bits zu zählen, den Zufall c in diesem Intervall wählen zu tun, dann sucht den c th gesetzt Bit.

+0

@Quentin fast: D Ich denke 'p' nicht' p-1' ist der gewünschte Index –

+0

@HannaKhalil das 'für' Inkrement wird' p' noch einmal nach 'c' hat Null erreicht, so dass ich es ausgleichen musste. – Quentin

Verwandte Themen