2012-01-26 41 views
0

我想重申一個程序,直到$頭變量和$尾變量都大於0.我無法弄清楚我做錯了什麼。 while循環經過一次迭代後總會被破壞。我想要它之前迭代打破

<?php 
echo "<table border=\"1\">"; 
echo "<tr><td>Person</td><td>Heads</td><td>Tails</td><td>Total</td></tr>"; 



for ($person=1; $person < 11; $person++){ 
echo "<tr><td>Person $person </td>"; 
$both = 0; 
$heads = 0; 
$tails = 0; 
$total = 0; 
while ($both < 1){ 
    do { 
     $total++; 
     $random = rand(1,2); 
     if ($random == 1){ 
      $heads++; 
     } else{ 
      $tails++; 
     } 
    } while (($tails < 0) && ($heads < 0)); 
    $both = 1; 

} 
echo "<td>$heads</td><td>$tails</td><td>$total</td>"; 
echo "</tr>"; 

} 

echo "</table>"; 

?> 

回答

2

在這一行

} while (($tails < 0) && ($heads < 0)); 

看來,無論是$tails也不$heads將永遠是嚴格小於0少,所以,將永遠是假的。兩者都試試<= 0

此外,從邏輯上講,如果的那些條件爲真,您想要再循環一次嗎?因此,請使用||而不是&&

結果:

} while (($tails <= 0) || ($heads <= 0)); 

而且,我有點好奇while ($both < 1)循環。看起來您在循環之前分配了$both = 0,並且在迭代結束時分配了$both = 1。這將保證循環只執行一次,在這種情況下 - 循環的意義何在?也許這只是未完成的代碼?

+0

工作很好。非常感謝。我不知道爲什麼我認爲這是&&操作符! – stytown

+0

對於你的問題,在$ tail和$ heads都大於0後,它只賦值$ both = 1。 – stytown

+1

@stytown對,但是你不會退出這個內部循環,直到'$ tails'和'$ heads'無論如何,大於'0',所以你永遠不會多次運行外部循環。 – Wiseguy

0

所以你想繼續翻轉硬幣,直到至少有一個頭至少有一個尾部結果?同時記錄你翻了多少次?

我會編碼是這樣的:

$heads = 0; 
$tails = 0; 
$total = 0; 

while(true) { 
    $total ++; 
    $random = rand(0, 1); // 0 for tail, 1 for head 
    if($random) $heads ++; 
    else   $tails ++; 

    if($heads >= 1 && $tails >= 1) break; 
} 

while循環將繼續運行無限直到兩個$頭和尾巴$成爲一個或更大。

+0

在我看來,這段代碼更可讀更清晰,但Wiseguy確實在代碼中解決了這個問題。 – hobbes3

+2

wont $ random總是在if語句中評估true嗎? – ppp

+0

在這其中,它將如何知道要添加到哪個變量($ head或$ tails)? – stytown

相關問題