2016-06-19 9 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. Генерирует случайное число п в диапазоне от 0 просуммировать (вес)
  3. Найти интервал, в котором п падает, и вы получили вашу ссылку.
+0

В этом коде есть ошибка, из-за которой не будет «победителем» около 3% времени. 'If' действительно должен быть' if ($ random_number> = $ last_interval && $ random_number = <$ key + $ last_interval) {'. [Исправлена] (http://sandbox.onlinephpfunctions.com/code/4ec841720659c647b008ed275dc5ebaea6d23a8a) vs [оригинал] (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]; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^