C++11/14でランダムなバイトデータを効率的に生成する 質問する

C++11/14でランダムなバイトデータを効率的に生成する 質問する

私の要件はランダムなバイトデータを生成することです(乱数ではありません)別名、均一に分散されたビット。

そこで、C++11/14のランダム機能を使ってこれを正しく効率的に行う方法は何だろうと考えていました。例を見てみましたが、全て数字の生成に重点を置いているようだ(int、floatなど)

現在私が使用しているソリューションは次のとおりです。

#include <vector>
#include <random>

int main()
{
   std::random_device rd;
   std::uniform_int_distribution<int> dist(0,255);
   std::vector<char> data(1000);
   for (char& d : data)
   {
      d = static_cast<char>(dist(rd) & 0xFF);
   }
   return 0;
}

ベストアンサー1

あなたが探しているのはstd::independent_bits_engineアダプタ:

#include <vector>
#include <random>
#include <climits>
#include <algorithm>
#include <functional>

using random_bytes_engine = std::independent_bits_engine<
    std::default_random_engine, CHAR_BIT, unsigned char>;

int main()
{
    random_bytes_engine rbe;
    std::vector<unsigned char> data(1000);
    std::generate(begin(data), end(data), std::ref(rbe));
}

受け入れられた回答は、一般的なケースでは厳密には正しくないことに注意してください。ランダム エンジンは範囲 [ min(), max()] に属する符号なし値を生成しますが、これは必ずしも結果の型のすべての可能な値 (たとえば、std::minstd_rand0::min() == 1) をカバーするわけではなく、したがって、エンジンを直接使用すると、均一に分散されていないランダム バイトが取得される可能性があります。ただし、 のstd::random_device範囲は [ std::numeric_limits<result_type>::min(), std::numeric_limits<result_type>::max()] であるため、この特定のエンジンもアダプターなしで正常に動作します。

おすすめ記事