[請益] 請問亂數不重複的寫法

看板PHP作者 (別急著吃棉花糖)時間12年前 (2013/05/05 14:55), 編輯推噓1(1016)
留言17則, 7人參與, 最新討論串1/1
因為自己在寫亂數排座位,且座號不重複,以表格呈現 條件:當輸入人數(欄位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

05/05 15:03, , 1F
shuffle()
05/05 15:03, 1F

05/05 15:09, , 2F
假設x人 先用迴圈產生一個array(1,2, ... ,x)
05/05 15:09, 2F

05/05 15:10, , 3F
再用shuffle()把這個array打亂 之後再依序輸出就好
05/05 15:10, 3F

05/05 15:11, , 4F
謝謝樓上二位,但我這樣的邏輯寫法有錯嗎?應該是沒錯才對呀
05/05 15:11, 4F

05/05 15:28, , 5F
你的 do-while 100% 會進入無窮迴圈
05/05 15:28, 5F

05/05 15:32, , 6F
更正,沒到100%,是只要總人數非7的倍數就會發生
05/05 15:32, 6F

05/05 15:34, , 7F
打亂1~$num的順序 => shuffle( range(1, $num ) )
05/05 15:34, 7F

05/05 15:39, , 8F
我提供另一個方式,比較類似你的原始想法
05/05 15:39, 8F

05/05 15:39, , 9F
一樣產生一個連續的 [1,2,3,..],然後用 array_rand() 取出
05/05 15:39, 9F

05/05 15:39, , 10F
請教我輸入33人時,最後一排空下的位置,會出現notice:
05/05 15:39, 10F

05/05 15:40, , 11F
取出的元素就 unset 掉.
05/05 15:40, 11F

05/05 15:40, , 12F
UNDEFINED OFFSET,要怎麼解決會較好呢?希望它就保留空的格
05/05 15:40, 12F

05/05 18:09, , 13F
array_rand + array_slice
05/05 18:09, 13F

05/05 22:02, , 14F
range + shuffle + array_chunk 研究看看
05/05 22:02, 14F

05/05 22:08, , 15F
至於table的輸出,可以參考 #1B3cxpDs 看看
05/05 22:08, 15F

05/09 20:35, , 16F
do 前面加一行
05/09 20:35, 16F

05/09 20:35, , 17F
if($i==$kk && $j > ($_POST["text"]%7) ) break;
05/09 20:35, 17F
文章代碼(AID): #1HXW9mDD (PHP)
文章代碼(AID): #1HXW9mDD (PHP)