根据加权百分比对一组URL进行随机播放

时间:2011-08-20 06:26:15

标签: php html random probability

我正在尝试弄清楚如何根据百分比对一系列URL进行随机播放,以便每个URL都被选中一定次数。

<?php

  $urls = array(
  'http://www.google.com'=>'25%', 
  'http://www.yahoo.com'=>'25%',
  'http://www.bing.com' =>'50%');

我想过去rand()路线,只是在1-100之间得到一个随机数,然后用一堆范围做一个switch语句,但这看起来不那么优雅和笨拙。我也不知道这样做有多可靠。我想尽可能接近完美。如果我洗了100次,我不确定大多数rand()示例会列出上面的数组,google.com和yahoo.com每次选择25次(+/- 2)和bing.com被选中50次。

他们是一种获得准确加权洗牌的方法吗?感谢

4 个答案:

答案 0 :(得分:1)

以下逻辑怎么样?

  1. 订购商品,以便优先级较高的商品位于顶部
  2. 从1-100
  3. 获取随机值
  4. 现在浏览列表并从随机值中减去项目的百分比,直到它变为负数。当发生这种情况时,停止迭代列表并选择项目作为选定的项目

答案 1 :(得分:1)

看起来你可以这么做:

usort( $myArr, function( $a, $b ) {
   return str_replace( "%", "", $a )/rand(1,100) - 
          str_replace( "%", "", $b )/rand(1,100);
} );

要获取前面的值,只需致电key

key( $myArr );

或者,您可以遍历整个事情:数组是随机值:

foreach( $myArr as $key => $val ) 
   // todo: do Something!

答案 2 :(得分:1)

你仍然想要一个兰特。在100的分布中,您不可能获得完全均匀的100%分布。如果您需要,您需要将状态存储在数据库中,或者以某种方式静态存储到服务器本身。实际上,你要做的只是递减数组值,直到它们全部为0,然后重新开始。

以下是没有完美匹配分布(假设它在一个函数中)它将如何工作的表示:

$urls = array(
  'http://www.google.com'=>25, 
  'http://www.yahoo.com'=>25,
  'http://www.bing.com' =>50);

// Assuming that totalWeight might not be 100 for some reason.
$totalWeight = array_sum(array_values($urls)); 

$currentWeight = 0;
$rand = rand(1,$totalWeight);

foreach ($urls as $key=>$value)
{
    $currentWeight += $value;
    if ($currentWeight > $rand)
    {
        return $key;
    }
}

答案 3 :(得分:0)

试试这个

    <?php
    $urls = array(
    'http://www.google.com'=>25, 
    'http://www.yahoo.com'=>25,
    'http://www.bing.com' =>50);

    $count = 1;
    $random = rand(0, 100);

    foreach($urls as $url => $range) {
       if($random > ($range * ($count - 1)) && $random < ($range * ($count + 1)))
           return $url;
       $count++;
    }   
    ?>