我正在尝试弄清楚如何根据百分比对一系列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次。
他们是一种获得准确加权洗牌的方法吗?感谢
答案 0 :(得分:1)
以下逻辑怎么样?
答案 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++;
}
?>