を満たす均一な整数を生成したい0 <= result <= maxValue
。
組み込みの符号なし整数型の全範囲で均一な値を返すジェネレーターがすでにあります。byte Byte()
this 、、、およびushort UInt16()
のメソッドを呼び出しましょう。これらの方法の結果は完全に均一であると仮定します。uint UInt32()
ulong UInt64()
uint UniformUInt(uint maxValue)
私が欲しいメソッドのシグネチャはとですulong UniformUInt(ulong maxValue)
。
私が探しているもの:
- 正し
さ私は、戻り値が指定された間隔で分散されることを望みます。
ただし、パフォーマンスが大幅に向上する場合は、非常に小さなバイアスでもかまいません。つまり、2^64の値が与えられた場合に2/3の確率で識別を可能にする次数のバイアスを意味します。
どのに対しても正しく機能する必要がありますmaxValue
。 - パフォーマンス
メソッドは高速である必要があります。 - 効率
この方法では、基になるジェネレーターによっては生のバイトの生成にコストがかかる可能性があるため、生のランダム性はほとんど消費されません。数ビットを無駄にすることは問題ありませんが、単一の数値を生成するためにたとえば128ビットを消費することはおそらく過剰です。
一部のメンバー変数で、前の呼び出しから残ったランダム性をキャッシュすることもできます。
intオーバーフローとラッピング動作に注意してください。
私はすでに解決策を持っています(答えとして投稿します)が、私の好みには少し醜いです。だから私はより良い解決策のアイデアを得たいと思います。
maxValue
2^64個のバケットと2^74個のランダムな値でヒストグラムを生成できないため、大きなsで単体テストを行う方法についての提案も役立ちます。もう1つの厄介な問題は、特定のバグでは、一部のmaxValue
ディストリビューションのみが大きくバイアスされ、他のディストリビューションはごくわずかしかバイアスされないことです。