引用 | 编辑
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 |