【问题标题】:Drawing straws using PHP使用 PHP 绘制吸管
【发布时间】:2020-02-06 00:21:43
【问题描述】:

上下文

最近,我一直在尝试让 php 吸管。如果你不知道什么是吸管,基本上就是有人得到别人的名字,别人得到别人的名字等等。 为了更清楚,随机生成的代码输出应该是这样的:

(以 4 人为例)

Person A drew person B
Person B drew person D
Person C drew person A
Person D drew Person B

尝试 1

为此,我尝试使用以下代码:

$name = $_POST["names"]; // <-- name-array
$participants = $_POST["participants"]; // <-- stores the amount of participants
$arrX = $name;

for($i = 1; $i <= $participants[0]; $i++) {
    echo $name[$i-1];
     echo " drew ";
     ${"randIndex$i"} = array_rand($arrX, 1);
     echo $arrX[${"randIndex$i"}];
     echo "<br><br>";
}

问题 1

虽然这确实提供了输出,但并不令人满意。 一个人可以画他/她自己,这是不允许的。我希望参与者画出自己以外的人。

我最好的猜测是,为了解决这个问题,我必须使用 if 语句。 我只是不知道如何以最合适的方式做到这一点。

编辑:问题 2

同样的输出也允许两个人画同一个人。 即人 A 和 B(可能还有更多人)画人 C。我想要它,以便每个人都可以画一个尚未绘制的人。

【问题讨论】:

  • array_unique() 可能会有所帮助。
  • 怎么样?我认为这会导致每个人都画同一个人..
  • 仅供参考,您在这里解释为“吸管”,实际上并不是该术语通常所指的内容。 en.wikipedia.org/wiki/Drawing_straws 只是说。
  • 等等,不是吗?但话说回来,这个游戏在我的母语中被称为“lootjes trekken”。我只是用谷歌将它翻译成英文,并认为它是完全相同的东西,哎呀..

标签: php arrays for-loop post random


【解决方案1】:

这是一个基于排列的简单解决方案。

$name = $_POST["names"]; // <-- name-array
$participants = $_POST["participants"]; // <-- stores the amount of participants

$last = $participants[0] - 1;
$map = range(0, $last);

for ($i = 0; $i <= $last; ++$i)
{
    if ($i != $last)
    {
        // randomly draw a person to the right
        $j = rand($i + 1, $last);

        // swap with the drawn person becoming no longer available for others since on their left
        $aux = $map[$i];
        $map[$i] = $map[$j];
        $map[$j] = $aux;
    }

    echo $name[$i], ' drew ', $name[$map[$i]], '<br/><br/>';
}

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 2012-05-14
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2012-01-31
    相关资源
    最近更新 更多