मैंने Microsoft Connect पर ऐसी सुविधा के लिए एक अनुरोध बनाया है। यदि यह ऐसी चीज है जिसे आप ढूंढ रहे हैं, तो कृपया इसे वोट करें और इसकी दृश्यता बढ़ाएं।
https://connect.microsoft.com/VisualStudio/feedback/details/634346/guassian-normal-distribution-random-numbers
यह सुविधा जावा एसडीके में शामिल है। इसका कार्यान्वयन प्रलेखन के भाग के रूप में उपलब्ध है और इसे आसानी से C # या अन्य .NET भाषाओं में पोर्ट किया जाता है।
यदि आप शुद्ध गति की तलाश कर रहे हैं, तो Zigorat Algorithm को आमतौर पर सबसे तेज़ दृष्टिकोण के रूप में पहचाना जाता है।
मैं इस विषय का विशेषज्ञ नहीं हूँ, हालांकि - मैं अपने रोबोअप 3 डी सिम्युलेटेड रोबोटिक फुटबॉल लाइब्रेरी के लिए एक कण फ़िल्टर को लागू करते समय इसके लिए आवश्यकता पर आया था और जब यह फ्रेमवर्क में शामिल नहीं किया गया था तो आश्चर्यचकित था।
इस बीच, इसके लिए एक रैपर Random
बॉक्स मुलर ध्रुवीय विधि का कुशल कार्यान्वयन प्रदान करता है:
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;
}
}