作者stator (別急著吃棉花糖)
看板PHP
標題[請益] 請問亂數不重複的寫法
時間Sun May 5 14:55:41 2013
因為自己在寫亂數排座位,且座號不重複,以表格呈現
條件:當輸入人數(欄位text)後,1排7個人會亂數排座位
以下是程式:但發現,座號會重複出現,已用陣列來判斷了,但還是無法解決
還請各位能幫忙指正是哪邊寫錯了。
<?php
for ($q=1;$q<=$_POST["text"];$q++)
{
$student[$q]=0; //一開始先將每位學生的flag設為0
}
if ($_POST["text"] % 7==0){
$kk=($_POST["text"] / 7) ;} //若人數剛好被7整除,則有$kk排
else{
$kk=intval($_POST["text"] / 7)+1; //否則取整數+1列
}
echo "<table border=1 bordercolor='#000000'>"; //產生表格
for ($i=1;$i<=$kk;$i++)
{
echo "<tr>";
for ($j=1;$j<=7;$j++)
{
do
{
$p=rand(1,$_POST["text"]); //隨機產生1到輸入的人數之間的亂數
}while ($student[$p]!=0); //當此學生出現過flag不等於0則要再產生一次
echo "<td>";
echo $p;
$student[$p]=1; //將隨機產生的座號陣列設為1,代表此座號已出現
echo "</td>";
}
echo "</tr>";
}
echo "</table>";
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.12.34.244
1F:→ bibo9901:shuffle() 05/05 15:03
2F:→ itisjoe:假設x人 先用迴圈產生一個array(1,2, ... ,x) 05/05 15:09
3F:→ itisjoe:再用shuffle()把這個array打亂 之後再依序輸出就好 05/05 15:10
4F:→ stator:謝謝樓上二位,但我這樣的邏輯寫法有錯嗎?應該是沒錯才對呀 05/05 15:11
5F:→ tyf99:你的 do-while 100% 會進入無窮迴圈 05/05 15:28
6F:→ tyf99:更正,沒到100%,是只要總人數非7的倍數就會發生 05/05 15:32
7F:→ bibo9901:打亂1~$num的順序 => shuffle( range(1, $num ) ) 05/05 15:34
8F:→ tyf99:我提供另一個方式,比較類似你的原始想法 05/05 15:39
9F:→ tyf99:一樣產生一個連續的 [1,2,3,..],然後用 array_rand() 取出 05/05 15:39
10F:→ stator:請教我輸入33人時,最後一排空下的位置,會出現notice: 05/05 15:39
11F:→ tyf99:取出的元素就 unset 掉. 05/05 15:40
12F:→ stator:UNDEFINED OFFSET,要怎麼解決會較好呢?希望它就保留空的格 05/05 15:40
13F:推 wayway2004:array_rand + array_slice 05/05 18:09
14F:→ liaosankai:range + shuffle + array_chunk 研究看看 05/05 22:02
15F:→ liaosankai:至於table的輸出,可以參考 #1B3cxpDs 看看 05/05 22:08
16F:→ lyforever:do 前面加一行 05/09 20:35
17F:→ lyforever:if($i==$kk && $j > ($_POST["text"]%7) ) break; 05/09 20:35