В настоящее время я использую C для генерации гауссовского шума. В один шаг мне нужно взять журнал равномерно распределенного номера u1 = (double) rand()/RAND_MAX
. Поскольку u1
может быть нулевым, существует риск делать log(u1)
. Итак, мне нужно проверить. Должен ли я использоватьИзбегайте деления на ноль в C при регистрации журнала относительно случайного числа
do {
u1 = ((double) rand()/RAND_MAX);
} while (u1 == 0.);
Или я должен использовать
do {
u1 = ((double) rand()/RAND_MAX);
} while (u1 < epsilon);
epsilon
, где небольшое число? Если последнее предпочтительнее, как выбрать значение epsilon? (В Фортране есть TINY
, но я не знаю, что делать на C).
Спасибо!
прилагается полный код:
#include <stdio.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <stdlib.h>
double gaussian_noise(double mean, double std)
{
static int have_spare = 0;
static double u1, u2, z1, z2;
if(have_spare)
{
have_spare = 0;
z2 = sqrt(-2. * log(u1)) * sin(2. * M_PI * u2);
return mean + std * z2;
}
have_spare = 1;
do {
u1 = ((double) rand()/RAND_MAX);
} while (u1 == 0.);
u2 = ((double) rand()/RAND_MAX);
z1 = sqrt(-2. * log(u1)) * cos(2. * M_PI * u2);
return mean + std * z1;
}
void main()
{
const double mean = 0., std = 1.;
double noise;
int i;
for(i=0; i<100000; i++)
{
noise = gaussian_noise(mean, std);
printf("%lf\t", noise);
}
}
Просто проверить его от 0 хватает. Журнал наименьшего значения (Double.MIN_VALUE) создает четко определенное число. – nhahtdh
должен работать так, как есть. Wrt TINY в Fortran, есть заголовок в C с множеством релевантных констант, пожалуйста, проверьте его –
'1.0/RAND_MAX' по-прежнему почти в 600 раз больше наименьшего положительного двойного значения, если' RAND_MAX == INT_MAX', t нужно беспокоиться –