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