掷硬币的概率问题
一、课堂内容
1.randint的用法
randint(low, high=None, size=None, dtype='l')
- low,high表示随机结果的取值范围;所有结果出现的概率想等。
- size表示结果的矩阵表达形式,size(a,b)其中a表示行数,b表示列数;其中a,b是int形式,或者tuple,不能是float。
例子1:randint(2, size = 10000)
返回:[0, 1, 0 ……, 1,1]
说明:取值结果为2以内的int,0或者1;一共显示10000个结果。
例子2:randint(2, size = (int(1e6), 2))
返回:
[0, 1]
[1, 0]
[1, 1]
……
[1, 0]
说明:取值结果为2以内的int,0或者1;一共显示1e6行X2列的矩阵结果。
2.choice的用法
choice(a, size=None, replace=True, p=None)
- 与randint的区别在于,可以设置每个结果出现的概率
二、练习内容
在学习完(一)的内容之后,Udacity提供的计算概率练习内容如下:
1.两次均衡掷硬币得到两次正面
2.三次均衡掷硬币得到一次正面
3.P(H) = 0.6 时三次非均衡掷硬币得到一次正面
4.一次掷骰子得到偶数
5.两次掷骰子得到相同值
1.两次均衡掷硬币得到两次正面
思考路径如下:
(1)如何生成两次均衡掷硬币的结果?
numpy.random.randint函数;
(2)如何将两次掷硬币的结果组合在一起?
可以想象成每组掷两次硬币,一共掷1000000组
or:
每组掷硬币的结果看成一列数据,两组的结果就是两列数据。形成一个N*2的矩阵
test_1 = numpy.random.randint(2, size = (int(1e6), 2))
(3)如何表达两次都是正面?
每次正面的结果是0,两次都是正面之和将仍然是0。所以可以考虑先求和。求和时每行的两个值相加,用axis=1来表达沿行计算。
test_sum = test_1.sum(axis = 1)
(4)两次都是正面的概率如何表达呢?
先挑出所有符合test_sum=0的值,每个符合的值表达为ture,然后将所有ture的值求个平均数即代表概率。
(test_sum == 0).mean()
2.三次均衡掷硬币得到一次正面
这个问题的思考路径和1.相同,只要将列数改为3;一次正面即数值之和为2。
test_2 = numpy.random.randint(2, size = (int(1e6), 3))
test_sum = test_2.sum(axis = 1)
(test_sum == 2).mean()
3.P(H) = 0.6 时三次非均衡掷硬币得到一次正面
同上两个问题,只需将randint改成choice,同时加上概率即可。
test_3 = numpy.random.choice([0, 1], p = [0.6, 0.4], size = (int(1e6), 3))
test_sum = test_3.sum(axis = 1)
(test_sum == 2).mean()
4.一次掷骰子得到偶数
该问题的思考路径:
(1)如何表达骰子6个结果的数列?
以前用的是2,现在改成1~7。
test_4 = numpy.random.randint(1, 7, size = 100000)
(2)如何表达偶数的意思?
%2 == 0
(test_4 % 2 == 0).mean()
5.两次掷骰子得到相同值
该问题的思考路径:
(1)如何表达掷骰子的结果?
tests_1 = numpy.random.randint(1, 7, size = 100000)
(2)如何表达两次掷骰子结果相同?
可以考虑为每次结果单独设为一列,然后让两列结果相等。
tests_2 = numpy.random.randint(1, 7, size = 100000)
(tests_1 == tests_2).mean()
三、总结
作为初学者,我最开始看第一道题目时整个人是蒙圈的,感觉在视频里学过的两个函数完全无法解决当前的问题。思考无解后不得不去看答案,然后开始琢磨:为什么这么表达?这么表达的思考路径是什么呢?答案里的表达能不能换一种方式呢?
在长时间的琢磨后,我想也许还有其他的初学者可能遇到和我一样的困惑,于是在简书上写了这样一篇学习笔记,兴许能为其他的初学者提供一些帮助。
这是Udacity数据分析(入门)课程的统计学lesson8的学习笔记一
转载请注明出处