C#正态随机数[复制](C# Normal Random Number [duplicate])

2019-09-01 06:56发布

这个问题已经在这里有一个答案:

  • 随机高斯序列 13分的答案

我想创建一个接受功能Double meanDouble deviation并返回正态分布的随机数。

例如:如果我通过在5.00为平均值和2.00作为偏差,时间68%I将得到3.00和7.00之间的一个数

我的统计是有点弱...。 任何人都有一个想法,我应该怎么处理这个? 我的实现将是C#2.0,但随时只要数学函数是标准在您所选择的语言来回答。

我认为这实际上可能是我所期待的。 任何帮助转化为代码?

在此先感谢您的帮助。

Answer 1:

看到这个CodeProject上的文章: 简单的随机数生成 。 该代码是非常短的,并且它从均匀的,正常的和指数分布产生样本。



Answer 2:

您可能会感兴趣的Math.NET ,特别是Numerics的包。

警告 :本NUMERICS包面向.NET 3.5。 您可能需要如果你是针对早期版本使用铱包...



Answer 3:

下面是一些C返回两个值(RAND1和RAND2),只是因为该算法有效地这样做。 这是极地形式箱穆勒变换 。

void RandVal (double mean1, double sigma1, double *rand1, double mean2, double sigma2, double *rand2)
{
double u1, u2, v1, v2, s, z1, z2;

do {
    u1 = Random (0., 1.);  // a uniform random number from 0 to 1
    u2 = Random (0., 1.);
    v1 = 2.*u1 - 1.;
    v2 = 2.*u2 - 1.;
    s = v1*v1 + v2*v2;
} while (s > 1. || s==0.); 

z1 = sqrt (-2.*log(s)/s)*v1;
z2 = sqrt (-2.*log(s)/s)*v2;
*rand1 = (z1*sigma1 + mean1);
*rand2 = (z2*sigma2 + mean2);
return;

}



Answer 4:

该库也不错:

.NET随机数生成器和分布



Answer 5:

对不起,我没有给你任何代码,但我可以指出你在维基百科上一些算法 。 你选择我猜该算法取决于你如何准确希望它的速度有多快它需要。



Answer 6:

对于那些引用了这个问题,一个简单的解决方案可能是:

Random rand = new Random();
double normRand  = alglib.invnormaldistribution(rand.NextDouble())

根据需要通过亩规模和sigma。
该alglib库可在www.alglib.net



Answer 7:

该MetaNumerics库,也.NET,将计算正态分布(和几乎任何来自其他统计数据),超级快。 看看该功能的页面了解更多详情。 CodePlex上网页是在这里: http://metanumerics.codeplex.com/ 。



Answer 8:

MathNet

从第二顶答案

    public static double GenerateRandomVariant(double mean,double deviation,System.Random rand=null, int factor=1)
    {

        rand = rand ?? new Random();
        double randNormal=(MathNet.Numerics.Distributions.Normal.Sample(rand, mean , deviation));
        return factor * randNormal;

    }

箱穆勒变换

从通过链接最多的回答(快一倍?)

通过U / yoyoyoyosef 随机变量高斯

    public static double GenerateRandomVariant(double mean, double deviation, System.Random rand=null, int factor = 1)
    {
        rand = rand ?? new Random();
        double u1 = 1.0 - rand.NextDouble(); //uniform(0,1] random doubles
        double u2 = 1.0 - rand.NextDouble();
        double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
                     Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
        double randNormal=(
                     mean +  deviation * randStdNormal); //random normal(mean,stdDev^2)
        return randNormal * factor;
    }


Answer 9:

我知道这个帖子是有点老了,但我想和大家分享一个小项目,我昨天创建的。 我认为,更简单的方法是使用C ++ 11和托管C ++创建一个.dll。 有一个链接到源和已编译包含DLL中的拉链。

和代码我做:

// NormalDistributionRandom.h
#include <random>

#pragma once

using namespace System;

namespace NormalDistribution 
{

    class _NormalDistributionRandom
    {
        std::default_random_engine engine;
        std::normal_distribution<double> distribution;

    public:
        _NormalDistributionRandom(double mean, double deviation) : distribution(mean, deviation)
        {
        }

        double Next()
        {
            return distribution(engine);
        }
    };

    public ref class NormalDistributionRandom
    {
    private:

        void* Distribution;

    public:

        NormalDistributionRandom( double mean, double deviation)
        {
            Distribution = new _NormalDistributionRandom(mean, deviation);
        }

        double Next()
        {
            return ((_NormalDistributionRandom*)Distribution)->Next();
        }
        ~NormalDistributionRandom()
        {
            this->!NormalDistributionRandom();
        }
    protected:
        !NormalDistributionRandom()
        {
            if (Distribution != nullptr)
            {
                delete (_NormalDistributionRandom*)Distribution;
                Distribution = nullptr;
            }
        }
    };

}


文章来源: C# Normal Random Number [duplicate]