В вашей среде для RAND_MAX
, вероятно, установлено наибольшее положительное число, например 0x7fff
(32767).Когда вы добавляете один к этому, он фактически оборачивается на минимальное отрицательное число, такое как 0x8000
(-32768).Это все предполагает дополняющее число два и то, что число будет перенесено, ни одно из которых не предусмотрено стандартом).
Итак, поскольку вы делите положительное или нулевое значение с rand
наотрицательное значение, в большинстве случаев вы получите отрицательное число, а иногда и ноль.
Вы можете использовать RAND_MAX
в делении вместо RAND_MAX+1
.Это не даст вам отрицательное число, но тогда вы столкнетесь с другой проблемой.
Поскольку существует вероятность, что rand
вернет RAND_MAX
, разделение может дать вам результат 1. Когда вызатем попытайтесь вычислить log (1 - decimal) * (-T)
, это принимает логарифм нуля, и вы получите ошибку: log(0)
не определено в математике.
Я бы предложил просто избежать этой проблемы, используя что-то вродеэто:
double Random::exponential (int T) {
int randVal = rand();
while (randVal == RAND_MAX)
randVal = rand();
double decimal = (double) randVal / RAND_MAX;
return log (1 - decimal) * (-T);
}
Это позволит избежать крайних случаев за счет случайного двойного вызова rand
.