不二如是 发表于 2018-8-21 16:47:14

0062 - 随机中的必然 |【简单几行代码看透误以为】

本帖最后由 不二如是 于 2019-8-23 14:29 编辑



最近看闲书,遇到了一个抛硬币实验很有意思,拿程序简单模拟了一下。

这么简单的事物,我们却存在偏见。

我们可怜的大脑,被误以为太厉害了,最近完结的思维(意识)的#七宗罪有兴趣的鱼油可以去了解下~

好了,言归正传,这个实验是这样的:
有一个统计学教授,在第一堂课上,给学生布置了个作业。

要求大家做一件特别乏味的工作,拿出一枚硬币,连扔200次,然后记下结果,正面还是反面,仔细记录。

教授提醒说:“你们可别造假,造假我可看得出来。”

学生们以为教授只是在吓唬人,没当回事。

对啊,什么叫连续扔硬币,不就是搞一个随机数嘛。

随机数就是没有规律的数啊,我们就编一个没有规律的结果不就行了吗?

这是人之常情嘛,所以手动胡乱写200个很方便有木有。。。

果然有学生偷懒,没有老老实实地去掷200次硬币,而是编了个记录表交差了。

奇怪的是,教授果然一眼就能识别出哪些学生偷懒了,没有真的扔硬币。

那教授怎么发现的?



魔鬼在细节



很简单,如果是我们偷懒怎么搞?

胡编一个记录,只要正反都有就得了~

就像这样:
正反正反反正反反..

如果只是胡乱的看看,那确实没问题,但是作为逻辑性思维很强的统计学教授一看就知道大有问题!

教授之所以一眼看出来是假的,就是因为这个记录表编造得太“随机”了。

造假者认为,只有这样才符合掷硬币这种“随机现象”的特征。

他们会极力避免连续出现多次同样的结果。

让我们暂停一下,鱼油刚才是不是也是这么认为的呢?



揭开真相



他们认为,那样“太不随机”了。

实际上,如果你真去老老实实地掷200次硬币,而记录下来,就会发现:
正面或者反面连续出现六七次的现象会很多。

真正的结果会像这样:
正反反反反反正正反反正正正正正正正。

其实,懂概率的人稍稍计算一下,就能解释这个现象。

你扔10次硬币,结果都是正面的概率很小,只有1/1024(1/(210)),是极小可能性,可当掷的次数足够多的时候,情况就不一样了。

公式:

f(n<k) =0
f(k) = 1/(2^k)
f(n+1)= f(n) + /, n>k
有兴趣的鱼油可以写一个递归脚本算一算。

如果掷上700次,那连续10个正面出现一次的概率就达到约29%。

如果掷上5000次呢?

连续10个正面出现的概率达到了91.37%;

如果掷上1万次,概率为99.99%,这时,几乎可以确定,一定会出现连续10个正面。

那么回到最初的问题,200次,连续出现5,6次同样的状况,概率是多少呢?

还有一种比较好理解的反证法。

连续抛硬币6次,6次都出现同面的概率为1/2的5次方,等于3.125%。

所以,一次尝试抛不出连续6个同面的概率是1-3.125%=96.875%

第一次没有抛出6个同面,硬币已经抛过了6次,我们还有194次机会尝试。

所以,可以得出连续抛硬币200次,相当于195次尝试抛出6个同面的机会,那么抛不出6个同面的概率就是96.875%的195次方,等于0.002 05。

用1减去0.002 05就是抛200次硬币,出现连续6个同面的概率:0.998约等于99.8%

这意味着什么?

意味着:
基本上一定会出现连续6次

鱼油不信是吧,来一段简单的JS代码,验证一下:
//    模拟200次
    for(var i = 1 ; i < 201 ;i++)
    {
      coinToss();
      if((i % 20) == 0)
      {
            document.write("<br><br>");
      }
    }
    function coinToss() {
//      随机数产生正反
      var result = Math.floor(Math.random() * 2);
      if(result == 0)
      {
            result = '正面';
      }
      else{
            result = '反面';
      }

      document.write(result+" ");
    }


看到了不?!

随便一次,结果中就有连续相同的结果,5-7次。

源码(回复“我爱鱼C”):
**** Hidden Message *****

所以,教授布置的作业很狡猾,他是让你掷硬币200次,其中一定会出现连续5-7次相同的情况。

如果看不到这种情况,看到的只要是更乱、更随机的记录结果,不用问啊,那就是学生偷懒造的假啊。



吹水



苏格拉底说过很多名言,其中这一句很适合今天的帖子:
未经审视的人生不值得度过

对于我们现在身处的时代,混乱无序中追求一种平衡,不管什么时代打麻将,可能都会发生:
一会儿手气特好,一会儿手气特差,好像麻将后面有鬼。就是打牌的时候,好像牌后面有人操纵。

这就是这个随机世界中的必然结果,当然等发生了再回看的必然,也没有多大意义。

但是,作为程序员我们可以这个鬼揪出来!

简单的一计算概率,大体赢面输面自然知晓。

而不是通过通过各种仪式,比如摸牌的姿势来讨好这个鬼。

所以麻将桌上也是特别容易诞生迷信的地方。

迷信和科学其实都是在找规律,只不过,科学讲究方法和证据,而迷信是一通胡来。

迷信的反义词是什么呢?

从上面来看那就不是科学了,是啥呢?

是承认不确定性,是承认随机性,承认有些东西不可解释,不可预测,并且欣然接纳它带来的结果。

所以,为什么程序员的认知能力都不错呢,因为能靠代码养活自己已经具备了如下两个条件:
第一要有逻辑思维能力。
第二会用代码验证随机性。

所以用代码思考自己的人生,还是很有意思的不是吗?!

之前在隔壁 JS 系列也写过一个双色球的代码,有兴趣的鱼油自行围观。(传送门)



预知更多神文请看:
菊、套与吹水 | 【???】

如果喜欢,别忘了评分{:10_281:} :

http://xxx.fishc.com/forum/201709/19/094516hku92k2g4kefz8ms.gif

如此多懂学习的VIP至尊都已订阅本专辑,你还不快点行动!(☞订阅传送门 )

JessiFly 发表于 2018-8-21 17:16:33

如果我是那个教授的学生,我可能也会像那样避免写出重复几次的结果,就像自己编一个随机数字一样,比如52036974180,总感觉有两个连续数字就好像不是随机的。
写了个验证抛200次硬币的python代码试了一下:
import random
for i in range(200):
        if i%20 == 0:
                print('\n')
        temp = random.randint(0,1)
        if temp:
                print('正',end='')
        else:
                print('反',end='')
反反反正正反反正反正反正反反反反正反正正

正反正正反正反反反反反反正反反反反正正反

正正正正正反正反反正反正反正反反正正正反

反正反反反反正正反反正正正反正正正反反反

正正反反正反反反反反正正反反反正正反正正

正正正反正反正反反正正正反反反正反正反正

正反反反正反正正反反正正正正反反正反正正

正正反正反反反反反反正正正正正反正正正反

正正正反反正反正反正反反正正正正反反正反

正反反反正反正正反正正反正反正反反正反反
竟然有这么多次连续重复的!{:10_257:}
学到了,学到了!{:10_279:}

小甲鱼 发表于 2018-8-21 16:50:15

菊、套与吹水,每天涨姿势~

alltolove 发表于 2018-8-22 12:51:39

根据概率学公式,投硬币的次数越多概率越接近百分之50,一开始投的时候可能是连续出正面或是反面都很正常

iipython 发表于 2018-8-22 15:13:40

这里机器产生的随机数是伪随机数,据说真正能产生接近于真实随机数的芯片和算法不会用于民用的,很昂贵的

空中鸟 发表于 2018-9-8 11:18:28

{:10_277:}

流动中的幸福 发表于 2018-9-13 10:32:03

学习

幽梦三影 发表于 2018-9-19 11:22:34

希望不二大佬能讲讲js加密

shawn27 发表于 2018-10-29 16:43:05

谢谢谢

郑载序 发表于 2019-1-21 21:48:29

我爱鱼C

涉案的李伟 发表于 2019-2-18 17:56:24

随机中果然存在必然

要学习 发表于 2019-2-26 11:08:01

这个是怎么算的。。。。(710/1024 = 50%)


求解。。。

数学渣

TCY 发表于 2019-5-25 13:50:03

有本事你发个随机算法(任意语言)

DavidCT 发表于 2020-3-12 19:24:23

叫兽就是叫兽啊,老油条了

Limitsaid 发表于 2020-5-10 03:12:37

我爱鱼C

落魄C 发表于 2020-5-10 16:30:51

我爱鱼c

LuckyTiger66 发表于 2020-5-12 02:40:33

我爱鱼C
页: [1]
查看完整版本: 0062 - 随机中的必然 |【简单几行代码看透误以为】