PHP: 52的随机列表,所以当重复时,它与前一个列表是唯一的


PHP: Random list of 52, so when repeated it's unique from the previous list?

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

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

开始和结束
0
...
51

不希望下一个列表以51开始,以0结束。

我一直在考虑如何处理这个问题。我知道PHP中的shuffle函数,但是每次它生成一个随机列表时,它都不知道前面的列表。同样,这些列表必须与之前的列表完全不同,而不是它为玩家生成的任何其他列表。

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

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

如何在PHP中做到这一点?谢谢!

这可能是通过使用随机方法,每次使用不同的"种子"数随机列表?

模式序列为4。因此,如果7654出现在之前的列表中,那么新列表中就不能有7654。

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

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.

例如,如果上一个数组在某个地方有值43,12,13...,并且我们将元素43添加到新数组中,那么我们确保下一个元素是除 12以外的任何元素。使用这种逻辑,应该不可能得到相同的重复序列。

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

编辑

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

你的假设有一个小问题

规则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个元素一个接一个的注释之后,下一部分来了。

你需要的是识别元素的方法,所以让我们假设每个"item"都有一个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;
}

它的作用是,你给它旧的数组和你画的数组,你给它一个数字有多少次出现在彼此之间可能是相同的。然后它就开始循环和数组切片来检查它们是否相等