vfp 产生正态分布随机数_泊松分布、正态分布、指数分布、负指数分布的随机数生成...

好久没更新专栏了,正好工作用到这个,更新一下。一些不常用,但有时候很有用的随机数生成函数。

学过概率论的人,肯定了解泊松分布、正态分布、指数分布、负指数分布的一些概念,肯定也知道这些分布是满足某些场景的统计数据的。

当时我就想,这种数据该怎么生成呢?当初网上找了很久,终于找到了实现的方法。原理我就不解释了,反正我也不懂,直接拿来用就是了。

/// <summary>
/// 数学函数
/// </summary>
class my_math
{
	static System.Random ran = new System.Random((int)(System.DateTime.Now.Ticks / 10000));
	#region 随机数生成
	/// <summary>
	/// 正态分布随机数
	/// </summary>
	const int N = 100;
	const int MAX = 50;
	const double MIN = 0.1;
	const int MIU = 40;
	const int SIGMA = 1;
	public double AverageRandom(double min, double max)//产生(min,max)之间均匀分布的随机数
	{
		int MINnteger = (int)(min * 10000);
		int MAXnteger = (int)(max * 10000);
		int resultInteger = ran.Next(MINnteger, MAXnteger);
		return resultInteger / 10000.0;
	}
	public double Normal(double x, double miu, double sigma) //正态分布概率密度函数
	{
		return 1.0 / (x * System.Math.Sqrt(2 * System.Math.PI) * sigma) * System.Math.Exp(-1 * (System.Math.Log(x) - miu) * (System.Math.Log(x) - miu) / (2 * sigma * sigma));
	}
	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"></param>
	/// <returns></returns>
	public double RandExp(double const_a)//const_a是指数分布的参数λ
	{
		double p;
		double temp;
		if (const_a != 0)
			temp = 1 / const_a;
		else
			throw new System.InvalidOperationException("除数不能为零!不能产生参数为零的指数分布!");
		double randres;
		while (true) //用于产生随机的密度,保证比参数λ小
		{
			p = ran.NextDouble();
			if (p < const_a)
				break;
		}
		randres = -temp * System.Math.Log(temp * p, System.Math.E);
		return randres;
	}

	/// <summary>
	/// 负指数分布随机数产生
	/// </summary>
	/// <param name="lam">参数</param>
	/// <returns></returns>

	public double ngtIndex(double lam)
	{
		double dec = ran.NextDouble();
		while (dec == 0)
			dec = ran.NextDouble();
		return -System.Math.Log(dec) / lam;
	}

	/// <summary>
	/// 泊松分布产生
	/// </summary>
	/// <param name="lam">参数</param>
	/// <param name="time">时间</param>
	/// <returns></returns>
	public double possion(double lam, double time)
	{
		int count = 0;
		while (true)
		{
			time -= ngtIndex(lam);
			if (time > 0)
				count++;
			else
				break;
		}
		return count;
	}
	#endregion
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值