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
1
A
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
http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution – chris
Danke chris. aber wie hilft das? Nicht alle Bits sind 1, daher sind nicht alle Indizes zwischen 0 und 31 gültig. –
Das klingt nach einem XY-Problem. Was versuchst du eigentlich zu erreichen? – NathanOliver