作者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