N个随机数,可以在2个元素后复制

时间:2013-11-18 09:41:54

标签: php random numbers

我想生成10个数字,每个数字范围从(1到5),但只能在2个元素之后复制

例如5 3 1 4 2 5(这里可以复制) 2 (这里不能重复,因为它出现在1个元素之前)......等等。

我在php中使用此代码但其性能非常糟糕,因为它有时会超过最长30秒的执行时间。

  <?php
      function contain($prevItems, $number) {
    if (count($prevItems) == 3)
    {
     array_shift($prevItems);
    }
        for ($k=0; $k<count($prevItems); $k++) {
            if ($prevItems[$k] == $number)
               return true;
        }
       return false;
     }
    $num[0] = rand(1,5);
    $prevItems[0] = $num[0];
    for ($i=1; $i<=10; $i++) {       
      $num[$i] = rand(1,5);       
      while (contain($prevItems, $num[$i])) {          
         $num[$i] = rand (1,5);       
      }       
    $prevItems[$i] = $num[$i];    //append into the array   
    }
     print_r($num);
?>

编辑:

我也尝试过这种方法,它的性能很好,但它重复元素

    <?php
 $evalAccurance = array();
       $count = 0;
       while ( $count < 11)
       {
       $random = rand(1, 5);
            if (in_array($random, $evalAccurance))
            {
                $p = $random;
                for ($k = $p ; $k <5; $k++)
                {
                    $random = $random++;
                    if (in_array($random, $evalAccurance))
                        continue 1;
                    else break 1;
                }
                if (in_array($random, $evalAccurance))
                {
                    for ($k = $p ; $k >0; $k--)
                {
                    $random = $random--;
                    if (in_array($random, $evalAccurance))
                        continue 1;
                    else break 1;
                }
                }
            }
            $evalAccurance[] = $random;
            if (count ($evalAccurance) == 4)
                array_shift($evalAccurance);
            print_r ($evalAccurance);
        $count++;
        }
    ?>

2 个答案:

答案 0 :(得分:1)

你可以这样做的一种方式:

// pass to function current array of numbers
function randomNumber($ar){
    // create a random number from 1 to 5
    $num = rand(1,5);

    // check backwards 3 elements for same number, if none found return it
    if(!in_array($num, array_slice($ar, -3, 3, true))){
        return $num;    
    } else {
        // else recall function with same array of numbers
        return randomNumber($ar);
    }
}


$array = array();

// loop 10 numbers and call randomNumber with current set of results.
for($i=1; $i<=10; $i++){
    $array[] = randomNumber($array);
}

print_r($array);

答案 1 :(得分:1)

使用PHP SPLQueue

$queue = new SplQueue();
$values = array(1, 2, 3, 4, 5);
$container = array();

for ($i = 0; $i < 10; $i++) {
    $value = give_random($values, $queue);
    $container[] = $value;
    if ($queue->offsetExists(1) AND $queue->offsetExists(0)) {
        $queue->dequeue();
    }
    $queue->enqueue($value);
}

function give_random(&$values, &$queue) {
    $picked_value = $values[array_rand($values)];
    if ($queue->offsetExists(1)) {
        if ($picked_value == $queue->offsetGet(1)) {
            $picked_value = give_random($values, $queue);
        }
    }
    if ($queue->offsetExists(0)) {
        if ($picked_value == $queue->offsetGet(0)) {
            $picked_value = give_random($values, $queue);
        }
    }
    return $picked_value;
}

print_r($container);

它可能更整洁,但你可以知道发生了什么。

干杯。