人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
立即订阅
953 人已学习
课程目录
已更新 15 讲 / 共 32 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (1讲)
开篇词 | 别闹了,学编程 ≠ 学语言
免费
语言基础篇 (13讲)
01 | 学习编程,我到底该选择哪门语言?
02 | 第一个程序:教你输出彩色的文字
03 | 判断与循环:给你的程序加上处理逻辑
04 | 随机函数:随机实验真的可以算 π 值嘛?
05 | 数组:一秒钟,定义 1000 个变量
06 | 字符串:彻底被你忽略的 printf 的高级用法
做好闭环(一):不看答案可能就白学了
07 | 指针系列(一):记住,指针变量也是变量
08 | 指针系列(二):记住,指针变量也是变量
09 | 函数:自己动手实现低配版 scanf 函数
10 | 预处理命令(上):必须掌握的“黑魔法”,让编译器帮你写代码
11 | 预处理命令(下):必须掌握的“黑魔法”,让编译器帮你写代码
做好闭环(二):函数是压缩的数组,数组是展开的函数
测试篇 (1讲)
期中测试 | 给语言基础篇交一份满分答卷,去迎接新的挑战!
人人都能学会的编程入门课
登录|注册

04 | 随机函数:随机实验真的可以算 π 值嘛?

胡光 2020-01-11
你好,我是胡光。上次课里关于判断和循环的内容你做练习了么?其实这两部分内容都不复杂,你想,判断就是“如果…就…”,而循环就是重复做一件事情。程序里,只是我们换了一种方式来描述和抽象这两个场景。

今日任务

今天的任务其实也是和上次讲的内容有很大关系。如果你对上次讲的内容不理解,我建议你先再好好回顾下上次讲的知识,然后开始今天的任务。
先来看看今天这 10 分钟我们要完成的任务。圆周率 π 对你来说肯定不是一个陌生的概念,它指的是圆的周长与直径的比值。在古代,数学家们为了计算 π 的精确值想尽方法,可能穷尽一生也不过精确到小数点后几位而已。但到了现在,你可能不相信,只要你知道 π 的定义,就可以利用编程轻易计算出 π 的值。那究竟怎么做到呢?
我们先来看一个用蒙特卡罗法计算 π 的示意图:
图1:蒙特卡罗法示意图
通过观察图 1,请你思考一个问题,如果你随机地在正方形区域中选择一个点,那么这个被选择的点,也恰巧落在圆形红色区域的概率是多大?这个问题很简单,就是圆面积和正方形面积的比值,简单计算就可以得到这个概率值,应该是 π/4。
也就是说,如果我们做大量的随机实验,最终落在圆内部的次数除以总次数再乘以 4 得到的值,应该接近圆周率 π。随机次数越多,所得到的数值越接近 π。你肯定不喜欢做这种重复的“重体力”劳动,但如果你写好编程,让它帮你做这件事,那就简单容易快捷多了。计算机可是一个不怕辛苦、没有怨言的好帮手,今天就让它来帮助我们完成这个任务吧。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(16)

  • rocedu
    rand实现用的公式给一下,更能说明伪随机性。

    作者回复: int __cdecl rand (
            void
            )
    {
            _ptiddata ptd = _getptd();

            return( ((ptd->_holdrand = ptd->_holdrand * 214013L
                + 2531011L) >> 16) & 0x7fff );
    }

    2020-02-02
    2
  • Geek_Andy_Lee00
    老师您好,为啥我的结果里面有重复的数字呢

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main() {
    int i, j;
    srand(time(0)); //初始化随机数种子
    for (i = 1, j = 1; i <= 100; i++, j++) {
    printf("%d\t", 1+rand() % 100);
    if (j % 10 == 0) printf("\n");
    }
    system("pause");
    return 0;
    }

    作者回复: 当然会有重复数字了,因为你对rand的结果取余了。rand的循环长度可能很大,可取余100以后,就很容易出现重复啊。就比如101和100001取余100,不都是1么。

    2020-01-14
    1
    1
  • 栾~龟虽寿!
    老师很厉害,才4节课你就会看到,老师想说,学编程,为做事高效,为生活添彩,如果你不断重复,成功概率会变化。

    作者回复: d(^_^o) 你这总结的太棒了,我得记下来!

    2020-01-12
    1
  • rocedu
    "记住,计算机就是你的小帮手了,以后的日子里,请动用你的智力,使用它的体力!"这真说出了为何人人都需会点编程。

    作者回复: d(^_^o)

    2020-02-03
  • 不便明言
    老师,我的输出都是一个数字,是不是啊没有验延时还是啥原因
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main() {
        //printf("%d\n", rand() % 1000);
        int i,j;
        for(i=0;i<100;i++)
        {
          for(j=0;j<10;j++)
          {
           srand(time(0));
           printf("%d\t", rand() % 100);
          
          }
        printf("\n");
        }
        return 0;
    }

    作者回复: 对,time(0)这个方法每次返回与当前秒相关的一个数字,也就是说如果你的程序在1秒内运行完了,那么你每次rand之前设置的随机种子都是一个值,所以输出的就是一个值了。其实随机种子设置一次即可。你把那句话放到住函数的第一句再试试。

    2020-01-23
    1
  • 信念
    我得出的结果为3.141664

    作者回复: d(^_^o)

    2020-01-22
  • 王建
    设计迷你随机函数有答案吗,我没有思路!

    作者回复: 有统一的答疑文章,往后看。

    2020-01-18
  • 潮汐
    int num;
    for (int i = 1; i <= 100; i++) {
    num = rand() % 100;
    printf("%d\n", num);
    }
    有两个问题请教老师。
    1、这里只能随机100数,并不能保证0-100的数字都输出一遍,存在重复数据问题,是思考题的对应的思路(期望实现方式里不使用数组)吗?
    2、文中说到rand(),如果没有传入随机种子,返回值不应该是一直不变吗?我也试过,单独的执行确实是不变的。但是放在循环里,为什么每次都取到了不同的值呢?

    作者回复: 这个是你的理解有偏差了。随机种子是设置第一个状态,不设置随机种子,也会有一个默认的初始状态。rand的功能,是获得下一个随机值。执行100次,就是向后依次性的得到伪随机序列中的100个值。跟是否设置随机种子无关。设置了随机种子,是保证前后两次程序执行的结果不同。仔细理解一下这段。Y(^_^)Y

    2020-01-15
  • 潮汐
    double x = 1.0 * rand() / RAND_MAX;
    老师为什么我这里打印这个值,范围是 0.474500 - 0.474599 ?

    作者回复: 设置随机种子了么?多执行几次随机程序看看结果呢?

    2020-01-15
  • 一步
    为什么语言层面实现不了真随机呢?

    作者回复: 因为计算机的每个计算过程,都是一个固定的且确定的过程。也就是说,由这些固定过程所生成的所谓随机值,也都是个固定值。只是这个生成的固定值,我们事先不知道是几,但不代表,它是真随机。你需要好好理解一下真随机,所谓真随机,是说产生每个数字的概率都相等。

    2020-01-15
  • 一步
    为什么有的语言的随机函数不用设置种子,每次获取到的随机数也是不一样的?(语言内部做封装了?比如js的Marh.random())

    作者回复: 嗯,虽然我没看过他底层的实现。不过,我可以肯定的告诉你,js也是伪随机,而你的猜想,是一个十分靠谱且合理的猜想!d(^_^o)

    2020-01-14
  • 阿阳
    真心话,老师太厉害了,高手!一个计算圆周率的问题,把之前讲的判断和循环还有随机数相关知识,讲的清清楚楚。一个老程序员学习后,深有感触。

    作者回复: d(^_^o)

    2020-01-14
  • 潮汐
    让计算机去做计算机擅长做的事。重复,计算…
    通过圆与正方形的面积关系,通过重复实验的统计结果去,结合起来得出圆周率的值,前人的智慧!
    2020-01-12
  • 奔跑的八戒
    例如,上面我们自己做出来的 6 个长度的伪随机序列,如果随机种子设置为值 1,我们得到的值依次是 635421,如果设置为值 3,那么我们将依次得到 542163。
    老师,这个怎么弄?给点提示。

    作者回复: 这个只是举个例子,说明伪随机序列其实是一个固定序列。

    2020-01-11
  • 许童童
    不错,不错,这点课对我这个老程序员收获也很大。

    作者回复: Y(^_^)Y

    2020-01-11
  • 梅利奥猪猪毛丽莎肉酱
    谢谢老师,搞懂随机种子了,计算π的值很秀,当中还想了下,用了勾股定理,斜边长度正好是圆内部的那根弦,所以属于在圆内,否则在圆外,再根据一开始推导的公式算出π,很完美

    作者回复: d(^_^o)

    2020-01-11
    3
收起评论
16
返回
顶部