[PHP]一萬次執骰機率

「設計一個亂數擲骰一萬次的程式,並且統計1點至6點出現的次數及出現的機率」


這個經典練習看似簡單,可以用最簡單的if else寫,也有比較進階的寫法
端看工程師的程式設計經驗,以下直接用程式碼說明



一開始要先介紹隨機取樣的函數: rand(start,end) 代表從start~end隨機取一個數字,其中包含從start和end的內容

現在來拆解這題的邏輯:
我們需要讓rand(1,6)跑一萬次,因為通用骰子是1~6的點數
來取得擲骰子的點數,然後統計各點數出現的次數,再算出機率。
為了統計出現次數,我們需要把出現的值放進變數裡面儲存

以下介紹工程師三個階段打出來的不同程式碼

階段一


這個階段還稱不上工程師,就是會if else,對其他的功能都不太熟悉
所以直覺就是先設定6個變數,用if else判斷rand(1,6)的結果
並且把符合的變數做+1,並且在印出的時候不同的點數就要多一行echo
這種程式碼雖然可以運作,但是執行效率會很低,並且會有很多重複的內容
想想看,六個點數就要六個echo...,但是至少是可以找出程式邏輯的

階段二


稍微有點經驗的工程師就會想到,哎呀何必用6個變數呢?
儲存在一個陣列裡面就可以啦;要印6次,我的陣列也有六個值
那我就用for迴圈把陣列index跑一遍不就好了嗎?
於是程式碼變成
//設定全域變數$total整隻程式都可以用$total= array(0,0,0,0,0,0);//設定一個長度為6的陣列,內容為0for($i=0;$i<=10000;$i++){

$dice = rand(1,6);//取得一萬次值骰資料//用switch找到對應值放入指定位置switch($dice){ case 1; $total[0]++; break; case 2; $total[1]++; break; case 3; $total[2]++; break; case 4; $total[3]++; break; case 5; $total[4]++; break; case 6; $total[5]++; break; } } //負責印出結果的迴圈
for($j=0;$j

 

階段三


這個階段對於程式已經可以說是熟悉,很可以寫出非常簡易的程式
這邊不改變印出的迴圈,只把上面第一個擲骰迴圈改成


for($i=0;$i 

直接擲骰,並且把擲骰結果(1~6)減一,符合陣列索引值(0~5)
然後把陣列內容+1,如此做一萬次達成目的

這次的練習程式碼一樣放在github上,檔案名稱為dice_10000.php
有問題歡迎參考,裡面有寫註解幫助閱讀

以上便是這次的練習,一萬次擲骰
如果說明有不清楚或是有所錯誤,麻煩不吝指教

留言