Моя проблема такова: мне нужно сгенерировать случайное число из распределения Гауссина / Нормы и создать гистограмму шириной 0,1.
class Gaussian
{
public static double Next(Random r, double mu = 0, double sigma = 1)
{
var u1 = r.NextDouble();
var u2 = r.NextDouble();
var rand_std_normal = Math.Sqrt(-2.0 * Math.Log(u1)) *
Math.Sin(2.0 * Math.PI * u2);
var rand_normal = mu + sigma * rand_std_normal;
return rand_normal;
}
}
Я использую вышеупомянутую функцию для генерации гауссиана случайное значение.
Теперь, чтобы создать гистограмму, мне нужен такой расчет, который мог бы автоматически преобразовать гауссово значение в индекс массива. Что-то вроде следующего:
static void Main(string[] args)
{
const int N = 1000;
int time = N;
const double binsDistance = 0.1;
int binsCount = (int)(N * binsDistance);
Random rand = new Random();
int[] array = new int[binsCount];
int side = 0;
for (int i = 0; i < time; i++)
{
double gauss = Gaussian.Next(rand);
int binNo = Normalization.Normalize(0, binsCount - 1, gauss);
array[binNo]++;
}
}
Для этого я попробовал два расчета.
- первый здесь .
- второй здесь .
Проблема с первым состоит в том, что он не может правильно обрабатывать отрицательные числа.
Проблема со вторым , он генерирует слишком много нулевых значений.
Итак, у меня есть два вопроса:
- В чем заключается базовая c разница между # 1 и # 2?
- Как мне добиться того, что я пытаюсь сделать?