Взвешенный процент между двумя ссылками?

Я работаю с двумя вращающимися ссылками в редиректоре 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

Решение

Это похоже на работу.

$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 и немного адаптирован вот концепция, которая будет работать. Благодарим Бенджамина Клостера, который сделал оригинальное сообщение.

  1. Подготовьте список интервалов от 0 до суммы (веса, 30 и 70 в вашем случае). Каждый интервал представляет одну ссылку, его длина является весом, поэтому для вашего примера:

    intervals = [70, 100]

    Где индекс 0-70 представляет ссылку № 1, 70-100 ссылка № 2.

  2. Генерация случайного числа n в диапазоне
    0 к сумме (весам)
  3. Найдите интервал, в который падает n, и вы получили свою ссылку.
1

Другие решения

Может быть, вы можете сделать это так:

$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];
}
0

По вопросам рекламы [email protected]