不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

随机函数:随机实验真的可以算 π 值吗

任务

圆周率 π 对你来说肯定不是一个陌生的概念,它指的是圆的周长与直径的比值。在古代,数学家们为了计算 π 的精确值想尽方法,可能穷尽一生也不过精确到小数点后几位而已。但到了现在,你可能不相信,只要你知道 π 的定义,就可以利用编程轻易计算出 π 的值。那究竟怎么做到呢?

编码

rand用法

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
printf("%d\n", rand() % 1000); // 永远输出固定值
srand(time(0));
printf("%d\n", rand() % 1000); // 每次运行都不同
return 0;
}
  • 在第 6 行代码里,我们虽然使用了 rand() 函数,可每次运行都将输出同样的值,这是因为我们没有设置随机种子,每次运行时 rand() 函数所记录的起始值都相同,所以每次运行输出的随机值也都相同。

  • 第 8 行代码中,由于我们根据程序运行时的当前时间设置了随机种子,每次运行程序,第 8 行都将输出不同的值。事实上,如果你在 srand() 函数里面设置一个固定值,每次运行程序,结果也都将是一样的。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
int n = 0, m = 0;
for (int i = 0; i < 1000000; i++) {
//循环每一次,让计算机帮我们做一次实验
double x = 1.0 * rand() / RAND_MAX; //rand() 随机函数,返回值的范围是[0, RAND_MAX],通过该表达式计算,我们就得到了一个[0.0, 1.0] 之间的随机值了。
double y = 1.0 * rand() / RAND_MAX;
if (x * x + y * y <= 1.0) m += 1; //判断一下随机选择的点,是否在圆内部;如果在,我们就记录一次
n += 1;
}
printf("%lf\n", 4.0 * m / n); //最后用落在圆里的次数比上总实验次数再乘以 4,就得到了 π 的近似值。
return 0;
}

/*
运行结果:
3.141664
*/

思考题

1,设计迷你随机函数

设计一个循环过程,循环 100 次,以不太明显的规律输出 1~100 中的每个数字。
要求 1:规律尽量不明显。
要求 2:只能使用循环和最基本的运算,不允许超前使用数组。

例如

1
2
3
4
5
6
7
8
9
10
 5 15 45 34  1  3  9 27 81 41
22 66 97 89 65 94 80 38 13 39
16 48 43 28 84 50 49 46 37 10
30 90 68 2 6 18 54 61 82 44
31 93 77 29 87 59 76 26 78 32
96 86 56 67100 98 92 74 20 60
79 35 4 12 36 7 21 63 88 62
85 53 58 73 17 51 52 55 64 91
71 11 33 99 95 83 47 40 19 57
70 8 24 72 14 42 25 75 23 69

实现

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main() {
int n = 5;
for (int i = 1; i <= 100; i++) {
printf("%2d ", n);
if (i % 10 == 0) printf("\n"); //十个一列
n = (n * 3) % 101;
}
return 0;
}

程序的灵魂在算法,算法的灵魂在数学。

小结

  • 学习rand用法。
  • 计算机中都是伪随机函数,也就是说,下一次的随机值,跟本次的随机值是相关的。
  • 使用srand函数设置随机种子,也就是设置伪随机过程中的第一个起始点的位置。
------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!