Microsoft Connect'te böyle bir özellik için bir istek oluşturdum. Bu aradığınız bir şeyse, lütfen ona oy verin ve görünürlüğünü artırın.
https://connect.microsoft.com/VisualStudio/feedback/details/634346/guassian-normal-distribution-random-numbers
Bu özellik Java SDK'ya dahildir. Uygulanması belgelerin bir parçası olarak mevcuttur ve C # veya diğer .NET dillerine kolayca taşınabilir.
Saf hız arıyorsanız, Zigorat Algoritması genellikle en hızlı yaklaşım olarak kabul edilir.
Yine de bu konuda uzman değilim - RoboCup 3D simüle edilmiş robotik futbol kütüphanem için bir parçacık filtresi uygularken buna ihtiyaç duydum ve bu çerçeveye dahil edilmediğinde şaşırdım.
Bu arada, Random
Box Muller polar yönteminin verimli bir şekilde uygulanmasını sağlayan bir sarmalayıcı burada :
public sealed class GaussianRandom
{
private bool _hasDeviate;
private double _storedDeviate;
private readonly Random _random;
public GaussianRandom(Random random = null)
{
_random = random ?? new Random();
}
/// <summary>
/// Obtains normally (Gaussian) distributed random numbers, using the Box-Muller
/// transformation. This transformation takes two uniformly distributed deviates
/// within the unit circle, and transforms them into two independently
/// distributed normal deviates.
/// </summary>
/// <param name="mu">The mean of the distribution. Default is zero.</param>
/// <param name="sigma">The standard deviation of the distribution. Default is one.</param>
/// <returns></returns>
public double NextGaussian(double mu = 0, double sigma = 1)
{
if (sigma <= 0)
throw new ArgumentOutOfRangeException("sigma", "Must be greater than zero.");
if (_hasDeviate)
{
_hasDeviate = false;
return _storedDeviate*sigma + mu;
}
double v1, v2, rSquared;
do
{
// two random values between -1.0 and 1.0
v1 = 2*_random.NextDouble() - 1;
v2 = 2*_random.NextDouble() - 1;
rSquared = v1*v1 + v2*v2;
// ensure within the unit circle
} while (rSquared >= 1 || rSquared == 0);
// calculate polar tranformation for each deviate
var polar = Math.Sqrt(-2*Math.Log(rSquared)/rSquared);
// store first deviate
_storedDeviate = v2*polar;
_hasDeviate = true;
// return second deviate
return v1*polar*sigma + mu;
}
}