以宾果的方式随机填充二维数组

时间:2013-08-20 11:38:37

标签: php

我有这两个功能:     

function drawNumber($drawnNumbers){
  $unique = true;

  while ($unique == true){
      $number = mt_rand(10, 69);
      if (!in_array($number, $drawnNumbers)){
        return $number;
        $unique = false;
      }
  }
}

 fillCard();  ?>

这是宾果游戏。该卡充满了随机数字。但我不能这样:

column column column column column column
row 10     13     16     14     16     19
row 24     26     28     29     23     21
row 36     33     39     30     31     35
row 46     48     42     45     43     47
row 59     56     51     52     58     50
row 60     65     68     62     61     67

所以我想让第一行的数字从10到19 第二行从20到29,依此类推。

我试过这个

<?php drawnNumber():    $number = mt_rand(0,9);
fillArray():  $number = $row . $number; ?>

但这不起作用,因为卡片中有两个数字。

所以在此之前我以不同的方式尝试了它,使用in_array:

<?php 
function fillCard(){
      $card = array();

    /* fill card with random numbers */
    for($i = 0, $min = 10, $max = 19; $i < 6; $i++, $min+=10, $max += 10)
    {
        for($j = 0; $j < 6; $j++)
        {
        $number =  mt_rand($min,$max) ;
    if(!in_array($number, $card){
            $card['row' . $i]['column' . $j]['number'] = $number;
            $card['row' . $i]['column' . $j]['found'] = 0;
        }
        }
    }
var_dump($card);
return $card;
}  ?>

但卡片中仍然有两个随机数字。 在过去的两周里,我尝试了其他一些想法,但我无法让它一起工作。 如果有一件事成功,那么另一件事就会失败。

我可以获得卡中的随机数而不是唯一的随机数。 我希望有一个人可以帮助我。 (有关额外信息:它是一个宾果游戏。所以drawnNumber()是“球”,它被绘制 并存储在数组$ drawnNumbers中,它们也是唯一的随机数。 fillCard()是 填充宾果卡并检查$ drawNumber是否在$ card中的函数

如果有人能告诉我如何让它发挥作用,我将不胜感激。也许在 一种算法方式还是一些代码? 提前谢谢。

3 个答案:

答案 0 :(得分:2)

一般来说,你从某种盒子中抽出,对吧?所以也一样,有一个包含所有可用数字的数组,一旦你得到一个随机数,删除它,所以下次你搜索一个数字时,你只会从其余数字中选择。小例子:

a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4

我们选择0到3之间的随机数(0和length - 1的{​​{1}})。假设我们选择索引2,然后看起来像:

a

现在,如果您绘制0到2之间的数字(请注意,您选择了a[0] = 1 a[1] = 2 a[2] = 4 的{​​{1}}!),您将不会以任何方式重新选择已选择的数字,从而为您提供一直都是唯一的数字。

P.S。这是一个简化版本,但是现在如果您可以将它应用于您自己,并且为您的示例创建几个您将从中挑选的数组。

答案 1 :(得分:1)

最简单的方法是使用额外的平面阵列来跟踪,并循环mt_rand

以下是事物的一个例子:

$drawn = array();

// Loop around until you have a new number in the desired range
do {
  $number = mt_rand($min,$max);
} while(in_array($number, $drawn));

// And save it to the $drawn array
$drawn[] = $rand;

为了澄清,上面的代码片段(没有$drawn的初始化)意味着替换行

$number =  mt_rand($min,$max) ;

代码。

答案 2 :(得分:0)

define('NB_ROWS', 6);
define('NB_COLS', 6);

$rows = range(10, NB_ROWS * 10, 10);

$bingo = array();

foreach($rows as $rowIndex)
{
    $availNumbers = range(0, 9);
    $line = array();
    for($cellIndex = 0; $cellIndex < NB_COLS; $cellIndex++)
    {
        // pick a random value among remaining ones for current line
        $numIndex = rand(0, count($availNumbers)-1); 
        list($value) = array_splice($availNumbers, $numIndex, 1);
        $line[] = $value + $rowIndex;
    }
    $bingo[] = $line;
}

print_r($bingo);