Получить нормальное распределение - C#
Формулировка задачи:
Добрый день.
Подскажите с таким вопросом:
насколько знаю, стандартные функции
возвращают случайное, равномерно-распределенное число (в первом случае - просто, во втором - от 0 до 1).
Возникла необходимость получить Нормально распределенную случайную величину с мат.ожиданием M и дисперсией D. Подскажите, как это можно реализовать при помощи стандартного рандома?
Random.Next(); Random.NextDouble();
Решение задачи: «Получить нормальное распределение»
textual
Листинг программы
using System;
using System.Linq;
namespace ConsoleApplication31
{
class Program
{
static void Main(string[] args)
{
double[] arr = new double[10000];
var rand = new ZRandom();
for (int i = 0; i < arr.Length; i++)
{
arr[i] = rand.Next(10, 2);
}
var mx = arr.Average();
var v2 = arr.Select(x => x * x).Average();
var dx = v2 - mx * mx;
var stddev = Math.Sqrt(dx);
Console.WriteLine("Mx = " + mx);
Console.WriteLine("StdDev = " + stddev);
}
}
public class ZRandom
{
private Random _random = new Random();
private double _z1 = double.NegativeInfinity;
public double Next()
{
double result;
if (!double.IsNegativeInfinity(_z1))
{
result = _z1;
_z1 = double.NegativeInfinity;
}
else
{
double x, y, s;
do
{
x = _random.NextDouble()*2 - 1;
y = _random.NextDouble()*2 - 1;
s = x*x + y*y;
} while (s <= 0 || s > 1);
result = x*Math.Sqrt(-2.0*Math.Log(s)/s);
_z1 = y*Math.Sqrt(-2.0*Math.Log(s)/s);
}
return result;
}
public double Next(double mean, double stddev)
{
return Next()*stddev + mean;
}
}
}