使用唯一的随机数表示switch语句

时间:2016-07-29 07:50:17

标签: php random

我需要一个函数或数组,它给出了1到47之间的随机数,所以我可以将它用于下面的代码。

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的每个案例和每个第一个参数都应该得到唯一随机ID。

当然我可以使用rand(),但很可能我得到了重复的值。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分: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之间抽取随机样本而不在池中替换它们,因此它们将是唯一的。

答案 1 :(得分: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)。