3

Box-Muller 変換は、ガウス分布からランダムな値をサンプリングする洗練された合理的な方法です。

明確に記述され、C# で記述された、より高速なメソッドを探しています。

参考までに、パフォーマンス比較のベースラインとして機能する Box-Muller 実装の実装を次に示します...

public class GaussianGenerator
{
    FastRandom _rng = new FastRandom();
    double? _spareValue = null;

    /// <summary>
    /// Get the next sample point from the gaussian distribution.
    /// </summary>
    public double NextDouble()
    {
        if(null != _spareValue)
        {
            double tmp = _spareValue.Value;
            _spareValue = null;
            return tmp;
        }

        // Generate two new gaussian values.
        double x, y, sqr;

        // We need a non-zero random point inside the unit circle.
        do
        {
            x = 2.0 * _rng.NextDouble() - 1.0;
            y = 2.0 * _rng.NextDouble() - 1.0;
            sqr = x * x + y * y;
        }
        while(sqr > 1.0 || sqr == 0);

        // Make the Box-Muller transformation.
        double fac = Math.Sqrt(-2.0 * Math.Log(sqr) / sqr);

        _spareValue = x * fac;
        return y * fac;
    }

    /// <summary>
    /// Get the next sample point from the gaussian distribution.
    /// </summary>
    public double NextDouble(double mu, double sigma)
    {
        return mu + (NextDouble() * sigma);
    }
}
4

4 に答える 4

6

記録のために、ここにユニットテストを含む明確に書かれた実装があります:

ZigguratGaussianDistribution.cs

私のIntelCorei7 6700T @ 2.8Ghz(Skylake)では、シングルコアテスト(BenchmarkDotNetを使用)で次のパフォーマンス結果が得られます。

  • ボックスミュラー:54.5Mサンプル/秒
  • ジッグラト:79.5Mサンプル/秒

したがって、Zigguratはこれらのテストで約45%高速です。

どちらのクラスも、疑似ランダム性のソースとしてRedzenライブラリのXoshiro256StarStarRandomクラスを使用します。

于 2011-09-11T21:26:52.070 に答える
1

均一比率法の使用は非常に高速です。私は C# 実装を持っていませんが、Excel VBA で使用したところ、Box-Muller アプローチと比較して 3 倍高速でした。均一な方法。

ここに画像の説明を入力

幸運を。

于 2015-02-10T21:11:18.870 に答える
1

C でのジッグラトの実装:

http://www.seehuhn.de/pages/ziggurat

また、GSL ソース (C) には、ガウス乱数ジェネレーターのいくつかの実装が含まれています。Box-Mueller 法と比率法が含まれます。

http://gsl.sourcearchive.com/documentation/1.14plus-pdfsg-1/randist_2gauss_8c-source.html

于 2011-08-27T01:10:59.920 に答える
0

ジッグラト サンプリングは非常に高速で、メモリ効率が高いです。C/C++ アプリケーションの場合、GSL ライブラリを使用できます。

于 2015-08-05T01:03:48.603 に答える