2016-06-19 13 views
0

私はPHPリダイレクタで2つの回転リンクを使って作業していますが、パーセンテージで重み付けする方法はありますか?2つのリンク間に重み付けされたパーセンテージ?

例:最初のリンクは70%のチャンスを持つか、リダイレクトされ、2番目のリンクは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"); 
?> 

は:そこに類似の質問ですが、以上の2つの変数を伴います。

+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)に及ぶ間隔のリストを準備します。各間隔は一つのリンクを表し、その長さは、それは重量だこと、あなたの例のためにそう:0-70のインデックスは、70〜100リンク#2をリンク#1を表し

    intervals = [70, 100]

  2. (重み)乱数を生成するn個の和に 0の範囲内
  3. nが低下し、あなたがあなたのリンクを持っている区間を探します。
+0

このコードには、3%の時間で「勝者」がないというバグがあります。 'if'は実際にはif($ random_number> = $ last_interval && $ random_number = <$ key + $ last_interval){'になります。 [固定バージョン](http://sandbox.onlinephpfunctions.com/code/4ec841720659c647b008ed275dc5ebaea6d23a8a)対[オリジナル](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]; 
} 
関連する問題