【问题标题】:Set Shuffle, No Repeating设置随机播放,不重复
【发布时间】:2025-12-01 19:10:02
【问题描述】:

我有一个闪存卡数组,使用 shuffle 我输出了 15 张独特的卡片,每张 3 张用于 5 个不同的类别。

我想做的是在同一个网页上为大约十几个人创建这些卡片组,但我不知道如何制作它,所以每个完整的集合都是独一无二的,并且不会重复给任何其他用户的集合。

带有简要说明的简短代码示例对我最有帮助。

这是我根据需要修改的代码。变化不大。

<?php
/* original source:
 * 3d10-engine.php
 * by Duane Brien
 */

if (empty($_POST)) {
for ($i = 1; $i < 16; $i++) {
    $numbers['ALL'][] = $i;
}

$picks = array();


$letters = array ('ALL');
foreach ($letters as $letter) {
    for ($i = 0;$i < 10;$i++) {
        shuffle($numbers[$letter]);
        $chunks = array_chunk($numbers[$letter], 5);
        $cards[$i][$letter] = $chunks[0];
        if ($letter == 'N') {
            $cards[$i][$letter][2] = '  '; // Free Space
        }

    }
    foreach ($numbers[$letter] as $number) {
        $balls[] = $letter.$number;
    }
    shuffle($balls);
}

$cardsstr = serialize($cards);
$ballsstr = serialize($balls);
$picksstr = serialize($picks);

} else {
$cards = unserialize($_POST['cardsstr']);
$balls = unserialize($_POST['ballsstr']);
$picks = unserialize($_POST['picksstr']);
array_unshift($picks, array_shift($balls));

echo "<h1>Just Picked: " . $picks[0] . "</h1>";

$cardsstr = serialize($cards);
$ballsstr = serialize($balls);
$picksstr = serialize($picks);
}

?>
Picks : <?php echo implode(',', $picks) ?>
<form method='post'>
<input type='hidden' name='cardsstr' value='<?php echo $cardsstr ?>' />
<input type='hidden' name='ballsstr' value='<?php echo $ballsstr ?>' />
<input type='hidden' name='picksstr' value='<?php echo $picksstr ?>' />
<input type='submit' name='cards' value='next number' />
</form>
<a href="3d10-engine.php">Start Over</a>
<?php

foreach ($cards as $card) {
echo "<table border='1'>";
echo "<tr><td>A</td><td>B</td><td>C</td><td>D</td><td>E</td></tr>";
for ($i = 0; $i < 5; $i++) {
    echo "<tr><td>" . $card['B'][$i] . "</td><td>" .$card['I'][$i]  . "</td><td>" . $card['N'][$i] . "</td>";
    echo "<td>" . $card['G'][$i] . "</td><td>" . $card['O'][$i] . "</td></tr>";
}
echo "</table>";
}

?>

【问题讨论】:

  • 介意发布您当前的代码吗?
  • 请展示你到目前为止所做的代码,无论它是否有效——它只会更好地展示你想要实现的目标。 shuffle 对我来说也不错,我不明白为什么它不适合你。
  • 好像是功课……
  • @Benoit,这不是作业。
  • @Sebastian:即使,这也不是问题。只需在问题中说出来,您就会得到更广泛的答案,然后解释事情是如何运作的。

标签: php arrays random shuffle


【解决方案1】:

由于您在每组中都有更多选项,因此随机选择足以获得独特的最终结果。 我的意思是不要让这件事变得更复杂。

试试这个示例

<?php
//Initialize your 5 sets here
$numbers['B'] = range(1,15);
$numbers['I'] = range(16,30);
$numbers['N'] = range(31,45);
$numbers['G'] = range(45,60);
$numbers['O'] = range(61,75);

//My Assumption is you to pick 3 from each 

while(TRUE){
 $rand = rand(0,5);
 if(count($numbers_B) < 3 && !in_array($numbers['B'][$rand]){
   $numbers_B[] = $numbers['B'][$rand];
 }

 $rand = rand(0,5);
 if(count($numbers_I) < 3 && !in_array($numbers['I'][$rand]){
   $numbers_I[] = $numbers['I'][$rand];
 }
 $rand = rand(0,5);
 if(count($numbers_N) < 3 && !in_array($numbers['N'][$rand]){
   $numbers_N[] = $numbers['N'][$rand];
 }
 $rand = rand(0,5);
 if(count($numbers_G) < 3 && !in_array($numbers['G'][$rand]){
   $numbers_G[] = $numbers['G'][$rand];
 }
 $rand = rand(0,5);
 if(count($numbers_O) < 3 && !in_array($numbers['O'][$rand]){
   $numbers_O[] = $numbers['O'][$rand];
 }

if( count($numbers_B) == 3 && count($numbers_I) == 3 && count($numbers_N) == 3 && 

count($numbers_G) == 3 && count($numbers_O) == 3 ){
  break;
 }
    }
    $result = $numbers_B + $numbers_I + $numbers_N + $numbers_G + $numbers_O; ?>

这里的 $result 值应该是唯一的,并且我认为集合的数量是恒定的。如果是动态的,那么用二维数组试试同样的逻辑。

【讨论】:

  • 谢谢,这是一个巨大的帮助。我会试用样品。我不是故意让事情变得复杂,我只是不知道任何其他方式。闪存卡将是单词,所以我想我需要使用变量将随机数映射到我的单词列表?
  • 感谢您的努力,非常感谢,但是在尝试了您的代码之后,我认为这不是一个好的解决方案。为了使上述代码正常工作,我必须修复一些错误。由于某种原因,每个数组都将自己添加到前一个数组中。请参阅此处的示例:redresistor.net/bringo.php B 数组的所有值都设置为“1”。我认为我的原始代码看起来更复杂,只是因为它包含 HTML 格式和数字选择器。删除它,它并不比你的复杂。不幸的是,重复的问题仍然存在,所以我很抱歉我不能接受你的回答。
  • 好的,刚刚意识到这个代码的每个字母都有不同的数字范围。难怪我一头雾水。但是,由于某种原因,B 数组仅输出 1。我会做更多的调试。谢谢。
  • @Sebatian 我没有执行代码。我的意图只是给出一个随机挑选的想法。我专注于循环,您在上面的代码中编写了嵌套循环来制作唯一的集合。我想删除的那个东西,因为我不知道整个逻辑,我只是​​给出了一个实现你目标的总体思路。谢谢
【解决方案2】:

只需将准备好的集合存储在一个数组中,然后使用已经(in_array 函数)检查每个 shuffle 是否存在于数组中,如果存在则再次 shuffle。

【讨论】:

  • 如果这会造成无限循环?
  • @hakre 要无穷无尽,它必须是一个非常短的字符串或非常多的玩家。
  • @InGodITrust - 我必须将所有可能的组合相乘,并将它们作为准备好的集合存储在数组中,然后在使用后将其删除。这是你说的吗?