php循环翻转硬币直到2个头,然后停止

时间:2019-02-19 23:53:17

标签: php function loops coin-flipping

我是php的新手,正在尝试编写一个循环,该循环将翻转硬币,直到恰好翻转了两个头然后停止为止。

到目前为止,我已经编写了用于掷硬币的功能:

function cointoss () {
    $cointoss = mt_rand(0,1);
    $headsimg = '<img src=""/>';
    $tailsimg = '<img src=""/>';
    if ($cointoss == 1){
        print $headsimg;
    } else {
        print $tailsimg;
    } 
    return $cointoss;
}

...但是卡在编写循环上。我尝试了几种方法:

#this code takes forever to load
$twoheads = 0;
for ($twoheads = 1 ; $twoheads <= 20; $twoheads++) {
    $cointoss = mt_rand(0,1);
    cointoss ();
    if ($cointoss == 1) { 
        do {
        cointoss ();
    } while ($cointoss == 1);

    }
}

#one coin flips 
do {
    cointoss ();
} while ($cointoss == 1);

这是一堂课,我们还没有学习数组,所以我需要在没有数组的情况下完成。

我了解条件为真时执行代码的循环的概念,但不了解条件不再为真时如何编写代码。

1 个答案:

答案 0 :(得分:2)

从“处理功能”内部进行打印是一种不好的习惯。您可能想声明一个showCoin($toss)函数进行打印。实际上,我不知道是否会打扰任何自定义函数。

您需要声明一个变量,该变量将保存函数中的return值。

通过存储当前和之前的折腾值,您可以简单检查一下是否出现了两个连续的“头”。

代码:(Demo

function cointoss () {
    return mt_rand(0,1);  // return zero or one
}

$previous_toss = null;
$toss = null;
do {
    if ($toss !== null) {  // only store a new "previous_toss" if not the first iteration
        $previous_toss = $toss;  // store last ieration's value
    }
    $toss = cointoss();  // get current iteration's value
    echo ($toss ? '<img src="heads.jpg"/>' : '<img src="tails.jpg"/>') , "\n";
    //    ^^^^^- if a non-zero/non-falsey value, it is heads, else tails
} while ($previous_toss + $toss != 2);
//       ^^^^^^^^^^^^^^^^^^^^^^- if 1 + 1 then 2 breaks the loop

可能的输出:

<img src="heads.jpg"/>
<img src="tails.jpg"/>
<img src="tails.jpg"/>
<img src="tails.jpg"/>
<img src="heads.jpg"/>
<img src="heads.jpg"/>