0

我正在用 PHP 编写游戏。数组 0 到 51 中有 52 个元素。目标是每次创建一个随机列表,该列表与前一个列表不同。这样下一个列表中的第一个列表中就没有序列模式。例如,如果第一个列表的模式包含为 7654,我们不希望 7654 的模式立即出现在下一个列表中。

规则是列表的第一个元素和最后一个元素不能是前一个列表的开始和结束元素。例如,如果第一个列表的开头和结尾为:

0
...
51

不希望下一个列表以 51 开头并以 0 结尾。

我一直在考虑如何处理这个问题。我知道 PHP 中的 shuffle 函数,但每次它生成一个随机列表时,它都不知道前一个列表。同样,列表需要直接与之前的列表不同,而不是与它为播放器生成的任何其他列表不同。

总体目标是每个列表与其前一个列表没有关系或共同模式。

我不知道这种随机列表是否有名称。

这怎么能在 PHP 中完成?谢谢!

这是否可以通过使用随机方法来完成,该方法每次随机化列表时使用不同的“种子”编号?

模式序列是 4。所以如果 7654 出现在上一个列表中,那么新列表中不能有 7654。

4

2 回答 2

1

好吧,您的假设存在一个小问题

规则1

The overall goal is that each list has no relationship or common pattern to it's previous list.

规则 2

The rule is that the first element of the list and the last element can't be the start and end elements from the previous list.

这两者相互矛盾。首先可能没有关系,所以随机。所以正如你所说的洗牌(没看是我相信你的话)。但是第二个需要知道前一个。与您之前的规则有什么矛盾。

但是您可以做的是拥有上一次抽奖(前 52 个)的第一个和最后一个元素。然后你洗牌当前的平局。如果第一个和/或最后一个元素相同,则再次绘制,直到找不到匹配项。

我也认为这个词是半随机的。

看看do{ }while();诀窍。


在评论彼此之间没有相同的4个元素之后,下一部分来了。

您需要的是识别元素的方法,所以让我们假设每个“项目”都有一个 id(出于示例的目的,我只使用 5 个元素)

让我们使用以下

array(
  0 => array('id' => 1,),
  1 => array('id' => 2,),
  2 => array('id' => 3,),
  3 => array('id' => 4,),
  4 => array('id' => 5,),
)

下一次抽签完全相同(仅出于示例的目的)。我们所做的是创建一个绘制的 id 数组:

array(
  0 => 1,
  1 => 2,
  2 => 3,
  3 => 4,
  4 => 5,
)

然后在以下函数中使用这个数组(未选中但应该给你一个正确的开始)

function check(array $prev, array $draw, $the_same = 4) {
  $to_check = count($prev) - $the_same;
  for($i = 0; $i < $to_check; $i++) {
    if ($array_slice($prev, $i, $the_same) === array_slice($draw, $i, $the_same)) {
       return false;
    }
  }
  return true;
}

是做什么的,你给它旧的数组和你画的那个,你给它的数字,有多少次出现在彼此之后,可能是一样的。然后它只是开始循环和数组切片以检查它们是否相等。

于 2013-06-06T11:52:59.443 回答
1

我想我有一个应该可以满足这些限制的解决方案。

function nextList($last) {
    $index = rand(1,50); // don't select first or last elements
    $out = array();
    do {
        list($value) = array_splice($last, $index, 1);
        $out[] = $value;
        $maxLoop = count($last);
        do {
            $newIndex = array_rand($last);
        } while ($newIndex == $index && --$maxLoop);
        $index = $newIndex;
    } while (count($last) > 1);
    $out[] = $last[0];

    return $out;
}

使用如下:

$first = range(0, 51);
shuffle($first);
$second = nextList($first);
$third = nextList($second);
// etc.

这样做的基础是,对于它添加到新数组中的每个元素,它不会由在最后一个数组中处理它的相同元素处理。

例如,如果最后一个数组在某处有 values 43,12,13...,并且我们将元素添加43到新数组中,那么我们确保下一个元素是任何元素EXCEPT 12。按照这个逻辑,应该不可能得到相同的重复序列。

它还确保第一个元素既不是最后一个数组的第一个元素也不是最后一个元素,但是,使这个约束也适用于数组的最后一个元素会困难得多。

编辑

我实际上能够使用checkHendriq 的答案中给出的函数来检查这个解决方案是否有效,并且它似乎总是返回一个有效的新列表,其中不包含来自最后一个数组的序列 =]

于 2013-06-06T13:42:28.003 回答