微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 调整生成随机强度值的算法

前几天,you helped me to find out an algorithm for generating random strength values in an online game (thx especially John Rasch).

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

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

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

解决方法:

原始代码中的值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< $low< $high应该是真的.) 这通过反向计算在所提供的范围内生成对数标度所需的线性标度来工作.例如,如果我希望我的对数比例为1.1 – 9.9,我会得到每个值的自然对数,给我0.0953 – 2.2925.然后,我在此线性范围内生成一个随机数,并将e提高到随机功率,将其转换回日志范围.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐