1

変化し続ける動的確率に基づいて数値を生成する乱数ジェネレーターを作成しようとしています。基本的にその機能は、ページからインデックスページに最も閲覧された投稿を選択して表示することです。したがって、最も閲覧されているページにはカウンターがあります。インデックスページで、このカウンターを取得し、確率として機能するカウンターに基づいて乱数を生成したいと考えています。カウンターが高いほどチャンスです。これまでの私の関数は次のようになっていますが、PHP に組み込み関数があるかどうか、またはこれをより効率的にする方法を知りたいです。

private function randomWithProbability($chance, $num, $range = false)
 {
    /* first generate a number from 1 to 100 and see if that number is in the range of chance */
    $rand = mt_rand(1, 100);

    if ($rand <= $chance) 
    {
        /* the number should be returned */
        return $num;
    }
    else 
    {
        /* otherwise return a random number */
        if ($range !== false)
        {
            /* make sure that this number is not same as the number for which we specified the chance */
            $rand = mt_rand(0, $range-1);
            while ($rand == $num)
            {
                $rand = mt_rand(0, $range-1);
            }

            return $rand;
        }
    }
 }

$range は、チャンスに該当しない数値を生成するための通常の範囲です。

ご協力ありがとうございました。

4

1 に答える 1

1

これは、作業にスパナを投入し、これを実装する方法を完全に変更する可能性があります。しかし、あなたが何をしたいのかを正しく理解していれば、累積確率を使用できませんか。

コードパッドでノックアップした例を次に示します。明らかに、私の例は単純であり、より適切にコーディングできますが、すべてのメカニズムを説明する必要があります。基本的に、ビュー数に基づいて各「投稿」の累積確率を取得し、乱数を生成します。出力の最後の配列を見ると、各投稿が表示される可能性があることがわかります (または、それを使って何をしても)、より多くの投稿が表示される可能性が高くなります。

http://codepad.org/9a72bezg

そして、コードパッドがダウンするためだけのコードをここに示します。

<?php
$posts = array(
 "php article" => 100,
 "c++ article" => 5,
 "monkey article" => 2,
 "another article" => 67,
 "one more" => 87,
 "ok i wanted another" => 34,
 "last one i promise" => 21
);

// Get total views
$total_views = array_sum($posts);

echo "total views: ".$total_views."\n\n";

// percentage posts
$posts_percents = array();
foreach($posts as $k => $v) {
  $posts_percents[$k] = ($v / $total_views) * 100;
}


//sort um
asort($posts_percents);

echo "chances of each post being viewed";
print_r($posts_percents);

//--- work out cumulative percents
$cumulative = array();
foreach($posts_percents as $k => $v) {
    $cumulative[$k] = end($cumulative) + $v;

}

echo "the cumulative probability";
print_r($cumulative);

//--- just a function i will use in the loop below, hopefully being in a function makes it easier to read than if i put it directly in th loop.
function get_post() {
   global $cumulative;

   asort($cumulative);

   $lowest = floor(current($cumulative));

   $rand = mt_rand($lowest,100);
   foreach($cumulative as $k => $v) {
     if($v > $rand)  {
      // echo $k." (".$rand.")\n";
       return $k;
       }
   }

}


$views=array();
for($i=0;$i<=1000;$i++) {
  $post_viewed = get_post();

  if(empty($post_viewed))
    continue;

  if(isset($views[$post_viewed]))
     $views[$post_viewed]++;
  else
     $views[$post_viewed]=1;

}

arsort($views);

echo "\n chances of being displayed \n\n";
print_r($views);

?>
于 2012-08-31T15:59:10.697 に答える