ランダム化された入力でテストを実行したいので、「適切な」乱数、つまり、テストされた関数の前提条件に合格するのに十分に一致する数値を生成する必要がありますが、うまくいけば、そのコードの奥深くで大混乱を引き起こします。
math.random()
(私はLuaを使用しています)均一に分散された乱数を生成します。これらをスケールアップすると、小さな数よりもはるかに多くの大きな数が得られ、整数はほとんどなくなります。
「単純な」数値を強く支持する方法で、乱数を歪めます (または、古い関数を乱数源として使用して新しい乱数を生成します) が、範囲全体をカバーします。つまり、正/負の無限大まで拡張します。 (または±1e309
) double
。これの意味は:
- たとえば、10 までの数字が最も一般的です。
- 整数は分数よりも一般的であるべきです。
- 0.5 で終わる数字は、最も一般的な分数である必要があります。
- 0.25 と 0.75 が続きます。次に 0.125、
- 等々。
別の説明:確率の合計が 1 になるように基本確率xを修正し、数nの確率をx kとして定義します
。ここで、kは、nが超現実的な数1として構成される世代です。xを 0 に、x 2を -1 と +1 に、
x 3を -2、-1/2、+1/2 と +2 に、というように割り当てます。これは、私が望むものに近いものをうまく説明していますが (少し歪んでいます)、乱数の計算にはほとんど使用できません。結果の分布はどこにも連続的ではありません (フラクタルです!)。基本確率を決定する方法がわかりません。x
(無限の精度ではゼロになると思います)、これに基づいた反復による数値の計算は非常に遅くなります(大きな数値を構築するのにほぼ無限の時間を費やします)。
均一に分散された乱数ソースが与えられた場合、上記のように非常に大まかに分散された乱数を生成する単純な近似を知っている人はいますか?
何千ものランダム化されたテストを実行したいのですが、品質よりも量/速度が重要です。それでも、数値が良いということは、拒否される入力が少なくなることを意味します。
Lua には JIT があるため、通常、パフォーマンスはそれほど問題になりません。ただし、ランダム性に基づくジャンプはすべての予測を破り、多くの呼び出しmath.random()
も遅くなります。これは、閉じた式が反復式または再帰式よりも優れていることを意味します。
1ウィキペディアにはシュールな数に関する記事があり、素敵な写真が掲載されています。超現実的な数は、2 つの超現実的な数のペア、つまりx := {n|m}
であり、その値はペアの中間の数、つまり (有限数の場合) {n|m} = (n+m)/2
(有理数として) です。ペアの片側が空の場合、それは 1 ずつインクリメント (または右が空の場合はデクリメント) として解釈されます。両側が空の場合、それはゼロです。最初は数字がないので、構築できる数字は だけです0 := { | }
。{0| } =: 1
第 2 世代では数とを構築でき、第 3 世代では、、および(さらに既知の数のより複雑な表現、たとえば){ |0} =: -1
を得ること
ができます。たとえば、{1| } =: 2
{|1} =: -2
{0|1} =: 1/2
{-1|0} =: -1/2
{-1|1} ? 0
1/3
は無限分数であるため、有限数によって生成されることはありません。同じことが浮動小数点数にも当てはまり、1/3
正確に表現されることはありません。