7

我有这两个功能:

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 中)

如果有人能告诉我如何让它工作,我将不胜感激。也许以算法方式或一些代码?先感谢您。

4

3 回答 3

2

一般来说,你从某种盒子里画画,对吧?同样的做法,有一个包含所有可用数字的数组,一旦你从中得到一个随机数,就将其删除,这样下次你搜索一个数字时,你只会从剩余的数字中选择。小例子:

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

我们选择一个介于 0 和 3 之间的随机数(包括 0 和 0 length - 1a。假设我们选择了索引 2,那么 a 将如下所示:

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

现在,如果您绘制一个介于 0 和 2 之间的数字(请注意,您取的是length - 1of a!),您将不会以任何方式重新选择已经选择的数字,从而始终为您提供唯一的数字。

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

于 2013-08-20T11:45:05.043 回答
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) ;

在你的代码中。

于 2013-08-20T11:46:27.793 回答
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);
于 2013-08-20T12:17:13.240 回答