2016-07-29 2 views
1

Мне нужна функция или массив, который дает мне случайные числа от 1 до 47, поэтому я могу использовать его для моего кода ниже.Использование уникальных случайных чисел для оператора switch

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

Пример

Это

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

должен выглядеть как-то так:

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

Так что это означает, каждый случай и каждый первый параметр функции build_html должен получить уникальный случайный идентификатор.

Конечно, я мог бы использовать rand(), но тогда вполне возможно, что я получу дублированные значения.

Любая помощь будет оценена!

+0

Вам нужны случайные числа от 1 до 47 или, скорее, не дублированные номера от 1 до 47? – Andrew

+0

@ Andrew Мне нужно 47 случайных чисел, потому что у меня 47 случаев, и каждый из них должен быть уникальным. – Reza

+0

Поскольку вы знаете диапазон, почему бы просто не сделать цикл? По соображениям вещей вам действительно не нужны случайные числа в диапазоне от 1 до 47, вам, скорее всего, нужны номера от 1 до 47. – Andrew

ответ

0

Создайте класс, как следует:

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 
     } 

} 

Используйте его как:

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

$sampler привлечет случайных выборок между 1-47 без их замены в бассейне и, следовательно, они будут уникальный.

0

Не тестировался, но я думаю, что это должно работать:

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

С помощью этого решения вы можете генерировать числа в каждом диапазоне ($min и $max параметров). Но он должен быть как минимум равным количеству нужных вам значений ($max).

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