ホームページ >バックエンド開発 >C++ >C で mt19937 の完全にランダムなシードを生成するにはどうすればよいですか?

C で mt19937 の完全にランダムなシードを生成するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-04 06:59:13566ブラウズ

How Can I Generate Thoroughly Random Seeds for mt19937 in C  ?

C での mt19937 の徹底的なランダム シード生成

問題:

最近の回答では、 の使用を提案することがよくあります。 std::random_device を使用して mt19937 PRNG をシードします。これは十分なランダム性を提供しないため欠陥がありますが、予測可能であり、固定シードの PRNG を使用する可能性があります。

ポータブルで完全なシード:

mt19937 をシードするための移植可能で徹底的なアプローチには、 CSPRNG、たとえば:

  • Windows: CryptGenRandom を利用した sysrandom
  • Unix-Like: /dev/urandom (または getrandom を利用した sysrandom) Linux 3.17 で利用可能な場合、または上位)
  • OpenBSD: getenttropy を利用した sysrandom

コード例:

#include <cstdint>
#include <cstdlib>
#include <fstream>

size_t sysrandom(void* dst, size_t dstlen);

std::uint_least32_t seed;
sysrandom(&seed, sizeof(seed));
std::mt19937 gen(seed);

Linuxとの専門化getrandom:

#if defined(HAVE_GETRANDOM)
size_t sysrandom(void* dst, size_t dstlen) {
  int bytes = syscall(SYS_getrandom, dst, dstlen, 0);
  if (bytes != dstlen) {
    throw std::runtime_error("Unable to read N bytes from CSPRNG.");
  }
  return dstlen;
}
#endif

OpenBSD 特殊ケース:

#if defined(HAVE_GETENTROPY)
size_t sysrandom(void* dst, size_t dstlen) {
  int bytes = getentropy(dst, dstlen);
  if (bytes != dstlen) {
    throw std::runtime_error("Unable to read N bytes from CSPRNG.");
  }
  return dstlen;
}
#endif

その他の考え:

  • 暗号的に安全なランダムなデータを取得するには、バッファなしの読み取り/書き込みアプローチを使用します。
  • 特殊な関数 (Linux や OpenBSD など) を追加して、効率を向上させることができます。

以上がC で mt19937 の完全にランダムなシードを生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。