C# 产生均匀分布随机数并求方差和期望

肉肉姐 2014-04-17 10:09:47
C#的,希望能加入点说明,谢谢
...全文
1047 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2014-04-17
  • 打赏
  • 举报
回复
google"白噪声发生器+算法"
threenewbee 2014-04-17
  • 打赏
  • 举报
回复
引用 6 楼 u014761440 的回复:
哦哦,那我想请教一下,那懂用线性同余法来求随机数啊? C#
用不着,用Random就可以了。
肉肉姐 2014-04-17
  • 打赏
  • 举报
回复
哦哦,那我想请教一下,那懂用线性同余法来求随机数啊? C#
Rumia 2014-04-17
  • 打赏
  • 举报
回复
引用 3 楼 u014761440 的回复:
错了,不求期望……可是求随机数的程序不懂怎么编呢
以前毕业设计做过,random比较坑,产生的N组随机数一摸一样。 http://www.cnblogs.com/izanami/archive/2011/04/20/2022173.html 看这个 记得后来我是用的第三个RNGCryptoServiceProvider 类来着
threenewbee 2014-04-17
  • 打赏
  • 举报
回复
你也没有说范围,比如说 Random rnd = new Random(); int rndData = Enumerable.Range(0, 100).Select(x => rnd.Next(0, 100)).ToArray(); //产生100个0~100的随机整数 double avg = rndData.Average(x => (double)x); double 方差 = rndData.Sum(x => ((double)x - avg) * ((double)x - avg));
肉肉姐 2014-04-17
  • 打赏
  • 举报
回复
错了,不求期望……可是求随机数的程序不懂怎么编呢
by_封爱 版主 2014-04-17
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
///正态分布
/// </summary>
public class NormalDistribution
{
    public NormalDistribution()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }
    /// <summary>
    /// 正态分布随机数
    /// </summary>
    const int N = 100;
    const int MAX = 50;
    const double MIN = 0.1;
    const int MIU = 40;
    const int SIGMA = 1;
    static Random aa = new Random((int)(DateTime.Now.Ticks / 10000));
    /// <summary>
    /// 产生(min,max)之间均匀分布的随机数
    /// </summary>
    /// <param name="min"></param>
    /// <param name="max"></param>
    /// <returns></returns>
    public double AverageRandom(double min, double max)
    {
        int MINnteger = (int)(min * 10000);
        int MAXnteger = (int)(max * 10000);
        int resultInteger = aa.Next(MINnteger, MAXnteger);
        return resultInteger / 10000.0;
    }
    /// <summary>
    /// 正态分布概率密度函数
    /// </summary>
    /// <param name="x"></param>
    /// <param name="miu"></param>
    /// <param name="sigma"></param>
    /// <returns></returns>
    public double Normal(double x, double miu, double sigma)
    {
        return 1.0 / (x * Math.Sqrt(2 * Math.PI) * sigma) * Math.Exp(-1 * (Math.Log(x) - miu) * (Math.Log(x) - miu) / (2 * sigma * sigma));
    }
    /// <summary>
    /// 产生正态分布随机数
    /// </summary>
    /// <param name="miu"></param>
    /// <param name="sigma"></param>
    /// <param name="min"></param>
    /// <param name="max"></param>
    /// <returns></returns>
    public double Random_Normal(double miu, double sigma, double min, double max)
    {
        double x;
        double dScope;
        double y;
        do
        {
            x = AverageRandom(min, max);
            y = Normal(x, miu, sigma);
            dScope = AverageRandom(0, Normal(miu, miu, sigma));
        } while (dScope > y);
        return x;
    }
    /// <summary>
    /// 指数分布随机数
    /// </summary>
    /// <param name="const_a">const_a是指数分布的参数λ</param>
    /// <returns></returns>
    public double RandExp(double const_a)
    {
        Random rand = new Random(Guid.NewGuid().GetHashCode());
        double p;
        double temp;
        if (const_a != 0)
            temp = 1 / const_a;
        else
            throw new System.InvalidOperationException("除数不能为零!不能产生参数为零的指数分布!");
        double randres;
        while (true) //用于产生随机的密度,保证比参数λ小
        {
            p = rand.NextDouble();
            if (p < const_a)
                break;
        }
        randres = -temp * Math.Log(temp * p, Math.E);
        return randres;
    }

    /// <summary>
    /// 求出数据平均值,并保留三位小数
    /// </summary>
    /// <param name="Valist">数据集合</param>
    /// <returns></returns>
    public double average(List<double> Valist)
    {
        double sum = 0;
        foreach (double d in Valist)
        {
            sum = sum + d;
        }
        double revl = System.Math.Round(sum / Valist.Count, 2);
        return revl;
    }
    /// <summary>
    /// 求数据集合标准差
    /// </summary>
    /// <param name="ValList"></param>
    /// <returns></returns>
    public double stdev(List<double> ValList)
    {
        double avg = average(ValList);
        double sumstdev = 0;
        foreach (double d in ValList)
        {
            sumstdev = sumstdev + (d - avg) * (d - avg);
        }
        double stdeval = System.Math.Sqrt(sumstdev);
        return System.Math.Round(stdeval, 2);
    }
}
以前做项目时候用到的正态分布,应该是你需要的..
threenewbee 2014-04-17
  • 打赏
  • 举报
回复
随机数用Random求 方差套公式 s^2=[(x1-x)^2 +(x2-x)^2 +......(xn-x)^2]/(n)其中x是平均数 期望这个要看你要求什么的期望。你没有说清楚

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧