下面是引用 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);
}