随机数
如何用计算机知识求π
我们做大量的随机实验,最终落在圆内部的次数除以总次数再乘以 4 得到的值,应该接近圆周率 π。随机次数越多,所得到的数值越接近 π。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i,n = 0, m = 0;
for (i = 0; i < 100000000; i++) {
double x = 1.0 * rand() / RAND_MAX;
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);
return 0;
}
真随机&伪随机
真随机其实并不难理解,我们以掷骰子为例,掷出 1~6 点的概率均为 1/6,如果我问你,上一次掷出的点数是 4,那么下一次掷出 6 点的概率是多大?你会发现,依然是 1/6,我们称这两次掷骰子的事件是相互独立的,上一次的结果和下一次之间没有必然联系。
什么叫做伪随机,因为一旦要是上一个随机函数的值确定了,下一个数字也就确定了,而纯正意义上的真随机,应该是前后两次出现的数字是两次独立事件,没有任何关系。
#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;
}
上述代码,第一个没有产生随机数种子,所以运行结果始终不会变,第二个因为有随机数种子,所以每次运行结果都是会改变的。
思考题:设计迷你随机函数
设计一个循环过程,循环 100 次,以不太明显的规律输出 1~100 中的每个数字。
要求 1:规律尽量不明显。
要求 2:只能使用循环和最基本的运算,不允许超前使用数组。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i;
for(i=0;i<100;i++)
printf("%d\t", rand() % 100); // 永远输出固定值
return 0;
}
总结
- 计算机中都是伪随机函数,也就是说,下一次的随机值,跟本次的随机值是相关的。
- 使用 srand 函数设置随机种子,也就是设置伪随机过程中的第一个起始点的位置。