У меня есть похожие методы в моем генераторе графиков (пришлось немного его изменить):
Возвращает случайное число с плавающей запятой, используя функцию генератора с определенным диапазоном:
private double NextFunctional(Func<double, double> func, double from, double to, double height, out double x)
{
double halfWidth = (to - from) / 2;
double distance = halfWidth + from;
x = this.rand.NextDouble() * 2 - 1;// -1 .. 1
double y = func(x);
x = halfWidth * x + distance;
y *= height;
return y;
}
Гауссовская функция:
private double Gauss(double x)
{
// Graph should look better with double-x scale.
x *= 2;
double σ = 1 / Math.Sqrt(2 * Math.PI);
double variance = Math.Pow(σ, 2);
double exp = -0.5 * Math.Pow(x, 2) / variance;
double y = 1 / Math.Sqrt(2 * Math.PI * variance) * Math.Pow(Math.E, exp);
return y;
}
Метод, который генерирует график с использованием случайных чисел:
private void PlotGraph(Graphics g, Pen p, double from, double to, double height)
{
for (int i = 0; i < 1000; i++)
{
double x;
double y = this.NextFunctional(this.Gauss, from, to, height, out x);
this.DrawPoint(g, p, x, y);
}
}
Я бы лучше использовал косинусную функцию - она намного быстрее и довольно близка к гауссовой функции для ваших нужд:
double x;
double y = this.NextFunctional(a => Math.Cos(a * Math.PI), from, to, height, out x);
Параметр out double x
в методе NextFunctional()
есть, поэтому вы можете легко проверить его на своих графиках (в моем методе я использую итератор).