2016-07-29 4 views
1

brauche ich eine Funktion oder ein Array, das mir zufällige Zahlen von 1 gibt - 47, also kann ich unten verwenden Sie es für meinen Code.Unter Einsatz einzigartiger Zufallszahlen für eine switch-Anweisung

public function output($question_id, $solution) { 
    $yes = ($GLOBALS['TSFE']->sys_language_uid == 0) ? 'Ja' : 'Oui'; 
    $no = ($GLOBALS['TSFE']->sys_language_uid == 0) ? 'Nein' : 'No'; 
    switch ($question_id) { 
     case 1: 
      $arg = array(
       'main_content' => $this->build_html(1, '01_0429_04_14_Psori_Arthro.jpg', $yes, $no, $solution) 
      ); 
     break; 
     case 2: 
      $arg = array(
       'main_content' => $this->build_html(2, '02_0342_05_14_Psori_Arthropathie.jpg', $yes, $no, $solution), 
      ); 
     break; 
     case 3: 
      $arg = array(
       'main_content' => $this->build_html(3, '03_0255_05_14_Psori_Arthropathie.jpg', $yes, $no, $solution), 
      ); 
     break; 
    } 
} 

Beispiel

Diese

case 1: 
    $arg = array(
     'main_content' => $this->build_html(1, '01_0429_04_14_Psori_Arthro.jpg', $yes, $no, $solution) 
    ); 

sollte wie folgt aussehen irgendwie:

case $random_id: 
    $arg = array(
     'main_content' => $this->build_html($random_id, '01_0429_04_14_Psori_Arthro.jpg', $yes, $no, $solution) 
    ); 

Das heißt also, jeder Fall und jeder erste Parameter der Funktion build_html sollte Holen Sie sich eine einzigartig zufällige ID.

Natürlich kann ich rand() verwenden, aber dann ist es durchaus möglich, dass ich duplizierten Werte erhalten.

Jede Hilfe wäre willkommen!

+0

Haben Sie zufällige Zahlen von 1 bis 47 oder eher Nicht-Duplikat Zahlen von/zwischen 1 bis 47 speziell benötigen? – Andrew

+0

@ Andrew Ich brauche 47 Zufallszahlen, weil ich 47 Fälle haben und jeder von ihnen sollte eindeutig sein. – Reza

+0

Da Sie die Reichweite kennen, warum nicht einfach eine Schleife machen? Durch das Aussehen der Dinge, die Sie nicht wirklich brauchen, Zufallszahl zwischen 1 bis 47, Sie eher benötigen, wissen Sie, die Zahlen zwischen 1 und 47 – Andrew

Antwort

0

Erstellen Sie eine Klasse wie folgt:

class SamplerWithoutReplacement { 
     private $pool; 

     public __construct($min,$max) { 
      $this->pool = range($min,$max);    
     } 

     public function next() { 
      if (!empty($this->pool)) { 
       $nIndex = array_rand($this->pool); 
       $value = $this->pool[$nIndex]; 
       unset($this->pool[$nIndex]); 
       return $value; 
      } 
      return null; //Or throw exception, depends on your handling preference 
     } 

} 

Verwenden Sie es als:

$sampler = new SamplerWithoutReplacement(1,47); 
//do things 
$value = $sampler->next(); 

Die $sampler werden Stichproben zwischen 1-47 ziehen, ohne sie in den Pool zu ersetzen und deshalb werden sie sein einzigartig.

0

Nicht getestet, aber ich denke, es sollte funktionieren:

$numbers = []; 
function genenerate_nr_not_in_list($list, $min = 1, $max = 47) { 
    $number = rand($min, $max); 
    while (false !== array_search($number, $list)) { 
     $number = rand($min, $max); 
    } 
    return $number; 
} 
for ($i = 0; $i < 47; $i++) { 
    $numbers[] = genenerate_nr_not_in_list($numbers); 
} 

Mit dieser Lösung können Sie erzeugen Zahlen in jedem Bereich ($min und $max Parameter). Aber es sollte mindestens so groß wie die Anzahl der Werte, die Sie benötigen ($max).

Verwandte Themen