ฉันสร้างคำขอสำหรับคุณลักษณะดังกล่าวบน Microsoft Connect หากนี่คือสิ่งที่คุณกำลังมองหาโปรดลงคะแนนให้และเพิ่มการแสดงผล
https://connect.microsoft.com/VisualStudio/feedback/details/634346/guassian-normal-distribution-random-numbers
คุณลักษณะนี้รวมอยู่ใน Java SDK การใช้งานมีให้เป็นส่วนหนึ่งของเอกสารและสามารถย้ายไปยัง C # หรือภาษา. NET อื่น ๆ ได้อย่างง่ายดาย
หากคุณกำลังมองหาความเร็วที่แท้จริงอัลกอริทึม Zigoratมักได้รับการยอมรับว่าเป็นแนวทางที่เร็วที่สุด
ฉันไม่ใช่ผู้เชี่ยวชาญในหัวข้อนี้ - ฉันพบความต้องการนี้ในขณะที่ใช้ตัวกรองอนุภาคสำหรับไลบรารีฟุตบอลหุ่นยนต์จำลอง RoboCup 3Dของฉันและรู้สึกประหลาดใจเมื่อสิ่งนี้ไม่รวมอยู่ในเฟรมเวิร์ก
ในขณะเดียวกันนี่คือเสื้อคลุมสำหรับRandomการใช้งานวิธีการขั้วโลกของ Box Muller อย่างมีประสิทธิภาพ:
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;
    }
}