C#正常随机数

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

例如:如果我传入5.00作为平均值而2.00作为偏差,68%的时间我会得到一个介于3.00和7.00之间的数字

我的统计数据有点弱…… 任何人都知道如何处理这个问题? 我的实现将是C#2.0,但只要数学函数是标准的,就可以用您选择的语言回答。

我认为这实际上可能就是我要找的东西。 任何帮助将此转换为代码?

在此先感谢您的帮助。

请参阅此CodeProject文章: 简单随机数生成 。 代码非常短,它从均匀,正常和指数分布生成样本。

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

警告 :数字包的目标是.NET 3.5。 如果您的目标是早期版本,则可能需要使用Iridium软件包…

这里有一些C返回两个值(rand1和rand2),只是因为算法有效地这样做了。 它是Box-Muller变换的极地forms。

 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; 

}

这个库也很不错:

.NET随机数生成器和分发

对不起,我没有任何代码,但我可以为您指出维基百科上的一些算法 。 我猜你选择的算法取决于你想要它的准确程度和需要的速度。

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

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

根据需要按mu和sigma缩放。
alglib库可在www.alglib.net上找到

MetaNumerics库,也是.NET,将超快速地计算正态分布(以及统计数据中的任何其他内容)。 有关更多详细信息,请查看function页面。 Codeplex页面位于: http : //metanumerics.codeplex.com/ 。

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; } 

Box-Mueller变换

从顶部答案通过链接(两倍的速度?)

由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; } 

我知道这篇文章有点旧,但我想分享我昨天创建的一个小项目。 我认为更简单的方法是使用C ++ 11并在托管C ++中创建.dll。 有一个链接到源和一个包含已经编译的DLL的zip。

我制作的代码:

 // NormalDistributionRandom.h #include  #pragma once using namespace System; namespace NormalDistribution { class _NormalDistributionRandom { std::default_random_engine engine; std::normal_distribution 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; } } }; }