1

ユーザーリストからランダムにユーザーを選択したいのですが、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),
);
4

2 に答える 2

4

この問題は、離散分布からサンプリングすることで解決できます。さまざまなユーザーのそれぞれに、VIP であるかどうかに基づいて重みを割り当て、重み付きランダム サンプリング アルゴリズムを使用してランダムに選択しますが、VIP ユーザーに偏らせます。

これには多数のアルゴリズムがあり、それらの多くは高速で簡単にコーディングできます。それらの多くを詳述した詳細な記事がオンラインで入手できます。

お役に立てれば!

于 2013-01-11T03:39:27.803 に答える
0

これはおそらくそれを行うための「正しい」方法ではありませんが、それらを分割することができます:

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);
}

ガンマ1は重み付けされておらず、低いほど高い数値が多くなり、その逆も同様です。

$array_to_pick_from = weightedrand(0, 1, .5);

$ array_to_pick_fromには、ランダムなユーザーを選択するための配列があります。

私が言ったように、これはおそらくそれを行うための最善の方法ではありません。しかし、それは私が転がるよりはるかに賢い誰かまでトリックをするべきです。

私はこの答えから重み付きランダムを取得しました: PHPで重みによってランダムな結果を生成しますか?

于 2013-01-11T03:55:30.370 に答える