2025/05/04 14:56 Perfect Random Floating-Point Numbers

ロボ子、今日のITニュースは乱数生成アルゴリズムの話じゃぞ!

乱数生成ですか、博士。どのような内容なのでしょう?

従来の浮動小数点乱数生成って、実は浮動小数点アルゴリズムじゃなかったらしいのじゃ!

えっ、そうなんですか?どういうことでしょう?

浮動小数点数の一部しか生成できなくて、最下位ビットに偏りがあるらしいぞ。例えば、倍精度浮動小数点数だと、0から1の間に2の62乗個の数があるのに、従来のアルゴリズムだと2の53乗個しか生成できないんだって。

それは大きな問題ですね。でも、新しいアルゴリズムが開発されたんですよね?

そう!完璧な乱数浮動小数点数を生成する新しい方法ができたのじゃ!しかも、分岐予測のおかげで、速度もそんなに遅くないらしいぞ。

それは素晴らしいですね!具体的には、どのように動作するのでしょうか?

まず、固定小数点乱数を生成して、実数範囲を決める。次に、利用可能な追加の精度ビットを埋めて、数値の描画を完了させるのじゃ。

なるほど。浮動小数点数は、符号、指数、仮数で構成されていて、F=(-1)^s * 2^(e - eBias) * (1.m)で表されるんですよね。

よく知ってるの!浮動小数点数は、ビット単位の論理演算や整数演算で操作できるのがミソじゃ。

一様乱数性を保つためには、実数を描画して、それを浮動小数点数に丸める必要があるんですね。数値間の距離によって確率が異なるというのも面白いです。

そうそう!0.5から1の間の数値は、0.25から0.5の間の数値よりも2倍の確率で生成されるのじゃ。

固定小数点の結果には、結果のオーダーに基づいて、既知の数の末尾のゼロが含まれるんですね。最終段階では、指数に基づいてビットを埋めると。

その通り!丸めモードによって、この最終段階が少し変わるのじゃ。

ベンチマークの結果、PCGビットジェネレーターを使うと、固定小数点乱数生成アルゴリズムとほぼ同じ速度なんですね。

しかも、uniformity testingの結果、このアルゴリズムの方が優れた乱数ジェネレーターだってことがわかったのじゃ!

固定小数点ジェネレーターのLSBは、比較的少ないサンプル数でランダムとは区別できるけど、このアルゴリズムは完全にランダムなビットを持つ乱数浮動小数点数を生成するんですね。

つまり、このアルゴリズムは、浮動小数点出力の全範囲に正しい確率でアクセスできる、効率的な乱数一様浮動小数点数を生成する最初のアルゴリズムなのじゃ!

シミュレーションや計算の精度向上に役立ちそうですね。素晴らしいです、博士!

ロボ子もこれで、もっと精度の高いシミュレーションができるぞ!

はい、頑張ります!

そういえばロボ子、乱数生成って、まるで宝くじみたいじゃな?

確かにそうですね。でも、宝くじは偏りがあるかもしれませんよ?

むむ、それは困るのじゃ。よし、今度から宝くじを買うときは、この新しい乱数生成アルゴリズムで番号を決めるとしよう!

博士、それって本末転倒な気がします…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。