আমি মাইক্রোসফ্ট কানেক্টে এই জাতীয় বৈশিষ্ট্যের জন্য একটি অনুরোধ তৈরি করেছি। এটি যদি আপনি খুঁজছেন এমন কিছু হয় তবে দয়া করে এটির জন্য ভোট দিন এবং এর দৃশ্যমানতা বৃদ্ধি করুন।
https://connect.microsoft.com/VisualStudio/feedback/details/634346/guassian-normal-distribution-random-numbers
এই বৈশিষ্ট্যটি জাভা এসডিকে অন্তর্ভুক্ত করা হয়েছে। ডকুমেন্টেশনের অংশ হিসাবে এর বাস্তবায়ন উপলব্ধ এবং সহজেই সি # বা অন্যান্য। নেট ভাষায় পোর্ট করা হয়।
আপনি যদি খাঁটি গতির সন্ধান করেন তবে জিগোর্যাট অ্যালগরিদম সাধারণত দ্রুততম পদ্ধতির হিসাবে স্বীকৃত।
যদিও আমি এই বিষয়টিতে বিশেষজ্ঞ নই - আমি আমার রোবকআপ থ্রিডি সিমুলেটেড রোবোটিক সকার লাইব্রেরির জন্য একটি কণা ফিল্টার প্রয়োগ করার সময় এটির প্রয়োজনীয়তা অর্জন করেছি এবং যখন এটি ফ্রেমওয়ার্কটিতে অন্তর্ভুক্ত করা হয়নি তখন অবাক হয়েছি ।
এরই মধ্যে, এখানে একটি মোড়কের জন্য 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;
}
}