【问题标题】:fill 2 dimensional array random in a bingo way以宾果游戏方式随机填充二维数组
【发布时间】:2013-08-20 11:38:37
【问题描述】:

我有这两个功能:

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

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

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

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

【问题讨论】:

  • 你只是想画一个数字网格,0-80/90,还是想画玩家玩的牌?

标签: php


【解决方案1】:

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

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

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

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

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

附:这是一个简化版本,但现在如果您可以将其应用到自己身上,并以您的示例为例,创建几个可供您选择的数组。

【讨论】:

    【解决方案2】:

    最简单的方法是有一个额外的平面数组来跟踪,然后循环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;
    

    为了澄清,上面的sn-p(没有$drawn的初始化)是为了替换行

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

    在您的代码中。

    【讨论】:

    • 我必须说它非常低效。尝试使用 100 个可用号码和 99 个需要选择的号码进行操作。这需要一段时间。
    • 对于手头的任务来说并不是一个真正的问题——在我的 PC 上运行 100 个号码仍然需要 0.005828 秒。诚然,您的方法对于更大的范围要好得多,但在这种情况下几乎没有什么区别。
    【解决方案3】:
    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);
    

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 2012-07-27
      • 1970-01-01
      • 2021-07-09
      • 2014-05-10
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多