加权随机数

写一个函数,可以根据各个元素的权重返回随机数 (加权随机数)
    function(Array_A,n)
    Array_A:是一个数组,表示各个元素出现的概率,
        n:为需要返回的元素个数

    如果n=1,则返回一个元素(Array_A中的key) , n=2则返回两个元素(Array_A中的key)

示例:

function({20,50,30},1): 返回长度为1的数组,其中返回值为{0}的概率为20/(20+50+30),返回值为{1}的概率为50/(20+50+30),返回值为{2}的概率为30/(20+50+30)
 *
function({20,50,30},2): 返回长度为2的数组,其中返回值中包含{0}的概率为20/(20+50+30),返回值中包含{1}的概率为50/(20+50+30),返回值中包含{2}的概率为30/(20+50+30)

思考如何验证上面的随机数权重是有效的。

function MyRand( array $arr , $number ){

    $sum = 0;

    # 处理数组的取值范围
    foreach( $arr as $key => $value ){
        $sum += $value;
        $new[] = $sum;
    }

    $return = [];

    # 循环指定次数
    while( $number -- ){

        $rand =  mt_rand( 0 , $sum - 1 );

        # 查找随机数相邻最近的key值
        foreach ( $new  as $key1 => $value2 )  {
            if( $rand < $value2 ){
                $return[] = $key1;
                break;
            }
        }

    }

    return $return;
}

#关于随机权重的准确性可以多生成几组随机数、计算下出现的概率
echo '<pre/>';
$new = MyRand( [ 20 , 50 , 30] , 100000 );
//print_r( $new );
$test_result = array_count_values( $new );
print_r( $test_result );
exit;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇葩也是花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值