ホームページ > バックエンド開発 > C++ > 高品質の乱数生成のために C で mt19937 を確実にシードするにはどうすればよいですか?

高品質の乱数生成のために C で mt19937 を確実にシードするにはどうすればよいですか?

DDD
リリース: 2024-11-29 13:36:25
オリジナル
362 人が閲覧しました

How Can I Reliably Seed mt19937 in C   for High-Quality Random Number Generation?

C での PRNG シーディングの問題への対処

が広く使用されているにもかかわらず、乱数を生成する場合、このアプローチは std::random_device に依存することが多く、これにはいくつかの制限があります。これらの問題を認識して、このディスカッションでは、mt19937 PRNG を徹底的に、移植可能かつ簡潔にシードする方法を検討します。

std::random_device と time(NULL) への唯一の依存を避ける

std::random_device を使用するか、 time(NULL) だけでは、エントロピーが低く分布が不均一であるため、mt19937 をシードするには不十分です。

解決策: CSPRNG ラッパーを使用する

size_t sysrandom(void* dst, size_t dstlen);
ログイン後にコピー

最小限の解決策は、次のとおりです。以下に定義する sysrandom など、CSPRNG のラッパー。このラッパーは、暗号グレードのランダム バイトへのアクセスを提供します:

プラットフォーム固有の実装

size_t sysrandom(void* dst, size_t dstlen)
{
    HCRYPTPROV ctx;
    ... // Acquire and release cryptographic context
    CryptGenRandom(ctx, dstlen, dst);
    return dstlen;
}
ログイン後にコピー

Windows の場合、CryptGenRandom を利用できます:

size_t sysrandom(void* dst, size_t dstlen)
{
    std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in);
    stream.read(dst, dstlen);
    return dstlen;
}
ログイン後にコピー

Unix のようなシステムでは、次のものを使用できます。 /dev/urandom:

mt19937 のシード

std::uint_least32_t seed;
sysrandom(&seed, sizeof(seed));
std::mt19937 gen(seed);
ログイン後にコピー

sysrandom ラッパーを使用すると、十分なビットで mt19937 をシードできます:

との比較Boost

このアプローチは、さまざまなプラットフォームで安全な CSPRNG を利用する boost::random_device と類似しています。

追加の考慮事項

Linux では、getrandom /dev/urandom のより安全な代替手段を提供します。 OpenBSD には /dev/urandom がありません。代わりに、getentropy を使用してください。

結論

この記事は、mt19937 PRNG を効果的にシードし、C で高品質な乱数生成を保証するための包括的なガイドを提供します

以上が高品質の乱数生成のために C で mt19937 を確実にシードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート