PHP 板


LINE

看板 PHP  RSS
※ 引述《star508 (star)》之銘言: : 今天有碰到一個問題,不知道有沒有人可以幫我解惑? : 有一個抽獎活動,共有九個獎項個別有設定好抽獎的機率, : 我是取一到一千的亂數,依照取得的亂數決定獎項,程式碼如下: : //九個獎項從第一獎到第九獎機率為2%,10%,15%,0.3%,0.7%,2%,10%,20%,40% : $prizeRange=array{0,20,100,150,3,7,20,100,200,400}; : $randNo=mt_rand(1,1000);//從一到一千隨機取出一數字 : $prizeNo=0;//從下方程式判斷得第幾獎 : //方法一(慢) : while($randNo>0){$randNo-=$prizeRang[$prizeNo+1];$prizeNo++;} : //方法二(快) : for($i=1;$i<count($prizeRange);$i++} : { : $randNo=$randNo-$prizeRange[$i]; : if ($randNo<=0) {$prizeNo=$i;break;} : } : // : 本來是用第一種方法,但是實際放上server執行時發現執行速度超慢,還會出現超過 : 超過30秒沒回應的error, : 後來改成第二種方法讓迴圈有實際的次數去跑,結果速度差很多,就算再寫個for迴圈 : 跑個2000次也是一開網頁就有執行結果,不知道到底為何結果差這麼多,照理說迴圈 : 執行的次數應該差不多啊,不知道有沒有人可以幫我解答,Tks! O()不同?在下看起來覺得一樣啊@@ (最差狀況下迴圈都只會執行count($prizeRange)-1次,即O()=n) 實際在cli環境下用time去計時也是得到差不多的結論 以下是測試資料 (有做一點程式碼簡化,並改為重複執行10萬次,使用php5 on Debian lenny測試 方法一: $p=array(0,20,100,150,3,7,20,100,200,400); for($j=0;$j<100000;$j++) { $a=mt_rand(1,1000); $r=0; while($a>0) $a-=$p[++$r]; } 結果 real 0m0.428s user 0m0.412s sys 0m0.020s 方法二: $p=array(0,20,100,150,3,7,20,100,200,400); for($j=0;$j<100000;$j++) { $a=mt_rand(1,1000); $r=0; for($r=1;$r<10;$r++) { $a-=$p[$r]; if($a<=0)break; } } 結果 real 0m0.518s user 0m0.496s sys 0m0.020s 此處我將prizeRange固定,否則加上10萬次count($p)所花的時間,兩者差距會更大 以上可知方法一還比較快,這是因為方法一少做一次條件判斷的關係 由此推論,原po有可能是方法一的原始碼有筆誤造成了無窮迴圈 此外若把方法二小小修改一下便可得到與方法一相同的速度 $p=array(0,20,100,150,3,7,20,100,200,400); for($j=0;$j<100000;$j++) { $a=mt_rand(1,1000); for($r=0;$a>0;$a-=$p[++$r]); } 結果: real 0m0.433s user 0m0.404s sys 0m0.028s 結果較方法一慢上一點點,這是php本身interpreting的轉換公式造成的 單以語言邏輯而言,此一修改後的程式碼是與方法一等價的 而理論上最快的應該是 $p=array(0,20,120,270,273,280,300,400,600,1000); for($j=0;$j<100000;$j++) { $a=mt_rand(1,1000); $r=1; while($a<=$p[$r])$r++; } 結果 real 0m0.209s user 0m0.188s sys 0m0.020s 這是因為比方法一再少了一次減法運算的關係 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.62.104.89 ※ 編輯: ronmi 來自: 61.62.104.89 (06/26 03:38)
1F:推 JoeHorn :sorry,沒仔細看。 方法一的問題出在陣列名稱錯誤。 06/26 03:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP