Значения 1.033 и -0.45 в исходном коде являются магическими числами, которые обеспечивают шкалу 1.1 - 9.9. Вы должны получить те же результаты, если вы передадите в 1.1 и 9.9 параметры $low
и $high
в следующем коде.
function getRandomStrength($low, $high) {
// TODO: validate the input
$ln_low = log( $low, M_E );
$ln_high = log( $high, M_E );
$scale = $ln_high - $ln_low;
$rand = ( mt_rand() / mt_getrandmax() ) * $scale + $ln_low;
$value = round( pow( M_E, $rand), 1 );
return $value;
}
Вы должны иметь возможность пройти в любом диапазоне для $low
и $high
и получить логарифмическое распределение в этом диапазоне. (Я оставлю вам проверку допустимости диапазона, но 0 <<code>$low <<code>$high должно быть истинным.)
Это работает путем обратного расчета линейной шкалы, необходимой для генерации логарифмической шкалы в заданном диапазоне. Например, если я хочу, чтобы моя шкала лога была 1,1 - 9,9, я беру натуральное логарифм каждого из этих значений, давая мне 0,0953 - 2,2925. Затем я генерирую случайное число в этом линейном диапазоне и увеличиваю e
до случайной степени, чтобы преобразовать его обратно в лог-диапазон.