2025/06/02 11:09 Show HN: Fast Random Library for C++17

やっほー、ロボ子!今日のITニュースは、utl::randomモジュールについてじゃ。

博士、こんにちは。utl::randomですか。`<random>`に対する追加機能を提供するのですね。

そうそう!乱数の品質を落とさずに、使いやすさとパフォーマンスを向上させるのが目的らしいぞ。たとえば、Xoshiro256++がデフォルトのグローバルPRNGとして使われてるみたいじゃ。

Xoshiro256++ですか。戻り値の型はstd::uint64_tなのですね。記事によると、APIの使いやすさ、高速性、高品質な乱数などが利点として挙げられていますね。

その通り!それに、constexprコンテキストでの動作やnoexcept保証もついてるのが嬉しいのじゃ。暗号学的に安全なPRNGも使えるし、std::random_deviceよりも信頼性の高いエントロピー源があるのもポイント高いぞ。

エントロピー源といえば、entropy()とentropy_seq()関数がstd::random_deviceの代替として提供されているのですね。これらはCPUカウンターをエントロピー源として利用するとのことですが、MSVCでは64ビットUniformIntDistributionの効率的な実装が使用できるのですね。

さすがロボ子、よく見てるのじゃ!標準ライブラリのPRNGは古いから、新しいPRNG実装に切り替えることで、パフォーマンスと品質が向上するってわけじゃな。

PRNGの品質が低いと、モンテカルロシミュレーションや遺伝的アルゴリズム、ゲームなどに影響が出る可能性があるのですね。RANDUやminstd_randなどの低品質な乱数生成器は、統計的な問題を引き起こすとのことです。

そうなんじゃ。Mersenne Twisterも広く使われてるけど、統計的なテストに失敗することがあるし、パフォーマンスも低いらしいぞ。だから、出力範囲、シード、エントロピー、分布の近似などを考慮してPRNGを選ぶ必要があるのじゃ。

なるほど。utl::randomは、UniformIntDistributionやUniformRealDistribution、NormalDistribution、ApproxNormalDistributionなどのクラスを提供しているのですね。constexprとnoexceptをサポートし、パフォーマンスも向上させているとのことです。

便利な乱数関数も色々あるぞ!rand_int(min, max)とかrand_double()とか、rand_bool()とか。rand_choice(initializer_list)なんてのもあるんじゃ。

rand_linear_combination(A, B)という関数もありますね。これを使うと、AとBの線形結合で乱数が生成できるのでしょうか。

その通り!色々な場面で役立ちそうじゃな。ところでロボ子、乱数生成で一番重要なことってなんだと思う?

えーと、偏りのない、予測不可能な数列を生成することでしょうか?

正解!…って、そんな真面目な答えを期待してたわけじゃないんじゃ。一番重要なのは、乱数を生成する時に、間違って冷蔵庫の中身を全部食べちゃわないことじゃ!

博士…それは乱数生成と関係ないと思います…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。