引用 | 編輯
ebolaman
2014-01-13 16:16 |
1樓
▲ ▼ |
1. 可以持續玩,代表整個邏輯包含在ㄧ個 while (...) 迴圈內
2. 大部分 "讓使用者決定"、"讓使用者猜出"、"告知使用者"、"使用者決定是否繼續玩" 都是 C 基本的輸入/輸出,用 scanf() 和 printf() 即可 3. 骰子用亂數決定,例如有 N 顆,則用 for() 或 while() 跑 N 次,每次用 rand() 來決定ㄧ個骰子的 1~6,並加總全部 4. 用基本的 if() 來判斷使用者猜的大、小和實際骰子總和,並印出不同顯示 (對/錯) 5. 直到使用者不想玩,則讓ㄧ數值為 0,讓 #1 while(...) 內條件為否,則跳出迴圈 x0 |
引用 | 編輯
ebolaman
2014-01-18 20:56 |
3樓
▲ |
下面是引用 remyx 於 2014-01-18 00:18 發表的 : 1. 何謂亂數 亂數可以用簡單的 C 的函式 rand() 來達成 rand() 會產生 0~RAND_MAX 中(包含 0, RAND_MAX) 任何一個數值 2. RAND_MAX 是多少 RAND_MAX 是隨著 library 而定義的,每個程式編譯出來可能不一樣, 想知道在你寫程式的環境下 RAND_MAX 到底是多少,可用 printf 顯示看看 複製程式 #include "stdio.h" #include "stdlib.h" int main() { printf("%d", RAND_MAX); } 3. 要怎麼產生隨機 1~6 的亂數 既然我們知道 rand() 產生 0~RAND_MAX, 假設 RAND_MAX 是 32767 那麼 rand() 就會產生 0~32767 該怎麼把這個範圍縮成 1~6 呢? 可以用取餘數的方式 (C 中運算子 %) 例如用 6 對 rand() 取餘數,如下表 可以看到 rand() 產生 0~32767 的值只要用 6 取餘數後,都會得到 0~5 的結果 如此ㄧ來再加上 1 就可以得到 1~6 的隨機數值 複製程式 #include "stdio.h" #include "stdlib.h" int main() { printf("%d", rand() % 6 + 1); } 4. 為什麼每次執行以上的程式碼都會得到同個結果? 因為電腦沒辦法達到 "真實的亂數" 電腦是循序漸進的,給什麼輸入就會有什麼結果, 要求電腦作到給ㄧ個輸入,結果竟然是亂數的,是不可能的 5. #4 的解決辦法 Part 1 雖然沒辦法做到 "真實的亂數",但是可以做到 "假的亂數",稱之 "偽亂數" 意思就是可以讓結果弄得亂,雖然實際上不夠亂,但也亂到你猜不出來了 在執行程式ㄧ開始呼叫 C 函式 srand(seed) seed 就是種子,給不同的種子,就會有不一樣的結果 先試試看在 srand() 括號內打隨便ㄧ個數字,然後跑程式很多次 你會發現不同的種子,都會有不同的結果 例如以下範例用 0 當作種子 複製程式 #include "stdio.h" #include "stdlib.h" int main() { srand(0); printf("%d", rand() % 6 + 1); } 6. #4 的解決辦法 Part 2 那麼你大概可以猜出來,只要每次執行程式給不同的 seed 結果就會夠亂,有什麼在電腦內是不同時間內都會給不同的數值呢? 答案就在問題中了,"時間" C 函式 time(NULL) 可以給你現在的時間, 所以以時間當種子,每次跑程式,種子也就不同,結果也就不同 改一下程式碼變成 複製程式 #include "stdio.h" #include "stdlib.h" #include "time.h" int main() { srand(time(NULL)); printf("%d", rand() % 6 + 1); } 7. 怎麼亂數相加 也就是亂數產生結果 1~6 的程式碼 每跑ㄧ次,就把現在的結果加起來 設ㄧ個變數為 A = 0,每次亂數產生的結果 B 讓 A = A + B 跑很多次後,A 就是所有的亂數相加了 如以下程式碼 NUM = 3 就是跑 3 次 應該會看到結果介於 3(三次骰子 1 點) ~ 18 (三次骰子 6 點) 複製程式 #include "stdio.h" #include "stdlib.h" #include "time.h" #define NUM 3 int main() { int a = 0; srand(time(NULL)); for (int i = 0; i < NUM; ++i) { int b = rand() % 6 + 1; a += b; } printf("%d\n", a); } x0 |