代码之家  ›  专栏  ›  技术社区  ›  J.Hendrix

C#普通随机数[重复]

  •  24
  • J.Hendrix  · 技术社区  · 16 年前

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

    示例:如果我取5.00作为平均值,2.00作为偏差,68%的情况下,我会得到一个介于3.00和7.00之间的数字

    this 这可能正是我所寻找的。有什么帮助将其转换为代码吗?

    提前感谢您的帮助。

    9 回复  |  直到 9 年前
        1
  •  21
  •   John D. Cook    16 年前

    请参阅此CodeProject文章: Simple Random Number Generation 该代码非常短,它从均匀分布、正态分布和指数分布中生成样本。

        2
  •  12
  •   Indeed is Trash    16 年前

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

    警告

        3
  •  7
  •   Ian W    16 年前

    这里有一些C返回两个值(rand1和rand2),只是因为算法有效地做到了这一点 Box-Muller transform .

    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;
    

    }

        5
  •  2
  •   shoelzer    13 年前

    很抱歉,我没有你的代码,但我可以为你指出 some algorithms on Wikipedia 我猜你选择的算法取决于你想要它有多准确,需要多快。

        6
  •  1
  •   Ace    13 年前

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

    根据需要按mu和sigma进行缩放。
    www.alglib.net

        7
  •  0
  •   Justin R.    16 年前

    从第二位答案

        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变换

    通过链接从顶部回答(快两倍?)

    Random Gaussian Variables

        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;
        }
    
        9
  •  -1
  •   pascx64    12 年前

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

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