Algorithm 如何控制随机选择的概率?

Algorithm 如何控制随机选择的概率?,algorithm,random,probability,Algorithm,Random,Probability,我想从用户列表中随机选择一个用户,但我希望VIP用户被选择的概率更高,如何实现这样的算法 样本数据: $users = array( array('name'=>'user1', 'is_vip'=>false), array('name'=>'user2', 'is_vip'=>false), array('name'=>'user3', 'is_vip'=>false), array('name'=>'user4',

我想从用户列表中随机选择一个用户,但我希望VIP用户被选择的概率更高,如何实现这样的算法

样本数据:

$users = array(
    array('name'=>'user1', 'is_vip'=>false),
    array('name'=>'user2', 'is_vip'=>false),
    array('name'=>'user3', 'is_vip'=>false),
    array('name'=>'user4', 'is_vip'=>false),
    array('name'=>'user5', 'is_vip'=>false),
    array('name'=>'user6', 'is_vip'=>true),
    array('name'=>'user7', 'is_vip'=>false),
    array('name'=>'user8', 'is_vip'=>false),
    array('name'=>'user8', 'is_vip'=>true),
    array('name'=>'user10', 'is_vip'=>true),
    array('name'=>'user11', 'is_vip'=>false),
    array('name'=>'user12', 'is_vip'=>false),
);

您可以通过从离散分布中采样来解决此问题。根据每个不同的用户是否是VIP,为他们分配一个权重,然后使用加权随机抽样算法随机选择他们,但偏向VIP用户

有很多算法可以实现这一点,其中很多都是快速且易于编码的。有一个详细的例子,其中很多


希望这有帮助

您可以通过从离散分布中采样来解决此问题。根据每个不同的用户是否是VIP,为他们分配一个权重,然后使用加权随机抽样算法随机选择他们,但偏向VIP用户

有很多算法可以实现这一点,其中很多都是快速且易于编码的。有一个详细的例子,其中很多


希望这有帮助

这很可能不是“正确”的方法,但您可以将它们分开:

foreach($users as $spUsers){
    if($spUsers['is_vip']==true){
        $splitUsers[0][]=array('name'=>$spUsers['name'],'is_vip'=>$spUsers['is_vip']);
    } else {
        $splitUsers[1][]=array('name'=>$spUsers['name'],'is_vip'=>$spUsers['is_vip']);
    }
}

function weightedrand($min, $max, $gamma) {
    $offset= $max-$min+1;
    return floor($min+pow(lcg_value(), $gamma)*$offset);
}
gamma 1是未加权的,越低给出的数值越高,反之亦然

$array_to_pick_from = weightedrand(0, 1, .5);
$array_to_pick_from将有一个数组来选择随机用户

就像我说的,这可能根本不是最好的方法。但它应该会起作用,直到有比我聪明得多的人出现

我从这个答案中得到了加权随机数:

这很可能不是“正确”的方法,但您可以将它们分开:

foreach($users as $spUsers){
    if($spUsers['is_vip']==true){
        $splitUsers[0][]=array('name'=>$spUsers['name'],'is_vip'=>$spUsers['is_vip']);
    } else {
        $splitUsers[1][]=array('name'=>$spUsers['name'],'is_vip'=>$spUsers['is_vip']);
    }
}

function weightedrand($min, $max, $gamma) {
    $offset= $max-$min+1;
    return floor($min+pow(lcg_value(), $gamma)*$offset);
}
gamma 1是未加权的,越低给出的数值越高,反之亦然

$array_to_pick_from = weightedrand(0, 1, .5);
$array_to_pick_from将有一个数组来选择随机用户

就像我说的,这可能根本不是最好的方法。但它应该会起作用,直到有比我聪明得多的人出现

我从这个答案中得到了加权随机数: