Matlab模拟抛硬币验证概率收敛时出现空图如何解决?
问题原因&修正方案
- 绘图逻辑错误:你每次循环只调用
plot(f(n-99))绘制单个数值,Matlab默认用实线绘图,孤立的单个点不会有任何显示;同时你没有开启hold on,每次执行plot都会清空上一次的绘图结果,循环结束后只剩下最后一个不可见的单点,自然显示为空图。 - 计数逻辑和注释矛盾:注释里写了2代表反面,但是你判断
temp == 1的时候就给反面计数加1,实际统计的是正面的出现频率。 - 代码效率低:内层逐次生成随机数的循环可以用向量化操作替代,运行速度会提升很多。
修正后代码
start_n = 100 maxn = 1000 f = zeros(1, maxn - start_n); n_list = start_n:maxn-1; for idx = 1:length(n_list) n = n_list(idx); % 向量化生成n次抛硬币结果,1代表正面,2代表反面 temp = unidrnd(2, 1, n); % 统计反面(值为2)的出现频率 numoftails = sum(temp == 2); f(idx) = numoftails / n; end % 一次性绘图,设置点样式+连线 plot(n_list, f, '-b.', 'MarkerSize', 2) xlabel('抛硬币次数n') ylabel('反面出现频率') yline(0.5, 'r--', '理论概率') % 画出0.5的理论参考线
运行修改后的代码就可以看到随着n增大,频率逐渐收敛到0.5的效果,符合大数定律的结论。
内容的提问来源于stack exchange,提问作者Kostas Bitos
相关产品推荐
相关产品推荐

