随机数

如何用计算机知识求π

我们做大量的随机实验,最终落在圆内部的次数除以总次数再乘以 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;
} 

总结

  1. 计算机中都是伪随机函数,也就是说,下一次的随机值,跟本次的随机值是相关的。
  2. 使用 srand 函数设置随机种子,也就是设置伪随机过程中的第一个起始点的位置。
posted @ 2020-03-27 14:23  insist钢  阅读(384)  评论(0编辑  收藏  举报