2016-06-19 26 views
0

Ich arbeite mit zwei rotierenden Links in einem PHP-Redirector, gibt es eine Möglichkeit, sie in Prozentsätzen zu gewichten?Gewichtete Prozentzahl zwischen zwei Links?

Zum Beispiel: Der erste Link hat eine 70% Chance oder wird umgeleitet und zweitens 30%.

Code:

<?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"); 
?> 

Hinweis: Es gibt ähnliche Fragen, aber mehr als zwei Variablen beinhalten.

+0

diese Lösungen verwenden, die mehr als 2 zufällige Elemente beinhalten. Du brauchst vielleicht mehr in der Zukunft und sie werden jetzt auch mit nur 2 funktionieren. –

Antwort

1

Dies scheint zu funktionieren.

$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; 

Konzept wurde von https://softwareengineering.stackexchange.com/questions/150616/return-random-list-item-by-its-weight genommen und etwas hier ist ein Konzept angepasst, die funktionieren würde. Kredit an @ Benjamin Kloster, der den ursprünglichen Beitrag gemacht hat.

  1. Bereiten Sie eine Liste von Intervallen vor, die 0 abdecken (Gewichte, 30 und 70 in Ihrem Fall). Jedes Intervall stellt eine Verbindung, deren Länge Gewicht es ist sein, so für Ihr Beispiel:

    intervals = [70, 100]

    Wo ein Index von 0-70 Link stellt # 1, 70-100 Link # 2.

  2. Generieren einer Zufallszahl n im Bereich von 0 bis Summe (Gewichte)
  3. das Intervall finden, in der n fällt und Sie haben Ihren Link.
+0

Es gibt einen Fehler in diesem Code, der dazu führt, dass es in 3% der Fälle keinen "Gewinner" gibt. Das 'if' sollte wirklich' if ($ random_number> = $ last_interval && $ random_number = <$ key + $ last_interval) {'sein. [Feste Version] (http://sandbox.onlinephpfunctions.com/code/4ec841720659c647b008ed275dc5ebaea6d23a8a) vs [Original] (http://sandbox.onlinephpfufctions.com/code/499cbe3ae875a13f099f91d531f472fd24c1bb04) – Samsquanch

0

Vielleicht kann man es so tun:

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