2016-06-19 27 views
0

我正在与一个php重定向器中的两个旋转链接,有没有一种方法来衡量他们的百分比?两个链接之间的加权比例?

例如:第一个链接将有70%的机会或获取重定向,第二个30%。

代码:

<?php 
$k = $_GET['sub']; 

$aff[] = 'http://google.com'; 
$aff[] = 'http://yahoo.com'; 

srand ((double) microtime() * 1000000); 
$random_number = rand(0,count($aff)-1); 

$lol = ($aff[$random_number]); 
$lal = $lol.$k; 

header("Location: $lal"); 
?> 

注意:有类似的问题,但涉及两个以上的变量。

+0

使用那些涉及超过2个随机项目的解决方案。您未来可能需要更多功能,而且他们现在也可以仅使用2个。 –

回答

1

这似乎工作。

$array = array(70 => "http://google.com", 
       30 => "http://yahoo.com"); 

$random_number = rand(0, 100); 
$last_interval = 0; 
$link = ""; 
foreach($array as $key => $value) { 
    // in range? 
    if($random_number > $last_interval && $random_number < $key + $last_interval) { 
     $link = $value; 
     break; 
    } 
    $last_interval = $key; 
} 

echo "You chose: " . $link; 

概念取自https://softwareengineering.stackexchange.com/questions/150616/return-random-list-item-by-its-weight并稍作修改,这里是一个可行的概念。感谢@Benjamin Kloster谁做了原始的职位。

  1. 准备一个覆盖0到总和(权重,30和70在你的情况下)的区间列表。每个间隔代表一个链路,其长度为它的重量,所以对于你的例子:

    intervals = [70, 100]

    凡0-70的指数表示链路#1,70-100链路#2。

  2. 生成一个随机数n的 范围为0〜总结(权重)
  3. 查找其中n落在区间和你有你的链接。
+0

此代码中存在一个错误,导致3%的时间内没有“赢家”。如果($ random_number> = $ last_interval && $ random_number = <$ key + $ last_interval){',if应该是真的。 [Fixed version](http://sandbox.onlinephpfunctions.com/code/4ec841720659c647b008ed275dc5ebaea6d23a8a)vs [original](http://sandbox.onlinephpfunctions.com/code/499cbe3ae875a13f099f91d531f472fd24c1bb04) – Samsquanch

0

也许你可以做这样的:

$array = array(
    array(30, 'http://google.de/'), 
    array(70, 'http://google.com/') 
); 



$number = rand(1, array_sum(array_column($array, 0))); 
$lastsum = 0; 
foreach($array as $arr){ 
    if($number > $lastsum && $number <= ($lastsum + $arr[0]) ){ 
     $url = $arr[1]; 
     break; 
    } 
    $lastsum += $arr[0]; 
}