调整算法以生成随机强度值

caw*_*caw 3 php random algorithm statistics

几天前,你帮助我找到了一个在线游戏中产生随机强度值的算法(尤其是John Rasch).

function getRandomStrength($quality) {
    $rand = mt_rand()/mt_getrandmax();
    $value = round(pow(M_E, ($rand - 1.033) / -0.45), 1);
    return $value;
}
Run Code Online (Sandbox Code Playgroud)

此函数生成介于1.1和9.9之间的值.现在我想调整这个函数,以便它给出相同概率的值但在另一个区间,例如1.5到8.0.如果您可以通过其他参数实现这一点,那将是完美的.

如果你能帮助我会很棒.提前致谢!

Bil*_*ard 5

原始代码中的值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;
}
Run Code Online (Sandbox Code Playgroud)

你应该能够在任何范围的传递$low$high并获得在该范围内的对数分布.(我会给你留下范围有效性检查,但0 $low<< $high应该是真的.)

这通过反向计算在所提供的范围内生成对数标度所需的线性标度来工作.例如,如果我希望我的对数比例为1.1 - 9.9,我会得到每个值的自然对数,给我0.0953 - 2.2925.然后,我在此线性范围内生成一个随机数,并提升e到随机功率,将其转换回日志范围.

  • 这绝对是一个"更清洁"的答案.如果我是你,我会跟我一起去.但是,请注意,有许多不同的对数函数将返回任何给定范围内的值.这些中的每一个都具有高值而不是低值的属性,但确切的数量会有多少不同.我的答案给出了与1.1和9.9之间完全相同的分布,只是"拉伸"线性.如果你想要那个,请使用我的:否则,使用它. (2认同)