如何正确调用生成100次掷骰子随机数的myRand函数?
解决调用myRand时的赋值不匹配错误
首先,咱们来搞清楚错误的根源:你的myRand函数已经一次性生成了100个骰子点数(返回的是100×1的向量),但在simulate函数里,你却在循环中试图把这100个值赋值给单个元素throw_dice(i),这就导致了元素数量不匹配的报错——毕竟一个位置放不下100个数据嘛!
而且你的simulate函数逻辑也绕远了:既然myRand已经帮你生成100次掷骰子的结果,根本不需要再写100次循环调用它。
修正后的simulate函数代码
function simulate() % 模拟掷骰子并计算偶数出现的概率点估计 countEven = 0; % 直接调用myRand获取100个样本,无需循环 throw_dice = myRand(); % 统计偶数的数量:利用模运算判断是否为偶数,再求和 even_mask = mod(throw_dice, 2) == 0; countEven = sum(even_mask); % 计算概率点估计量P P = countEven / length(throw_dice); fprintf('掷出偶数的概率点估计为:%.4f\n', P); end
关键改动说明
- 去掉多余循环:直接调用一次
myRand()就能得到100个掷骰子结果,避免重复生成数据和赋值错误。 - 高效统计偶数:用
mod(throw_dice, 2) == 0生成逻辑掩码,再用sum()统计偶数的个数,比逐个判断更简洁高效。 - 添加概率计算:按照点估计的逻辑,用偶数出现的次数除以总次数得到估计值,并打印结果。
额外优化建议(可选)
如果你希望myRand能灵活生成任意数量的样本,可以修改它为带参数的函数,比如:
function [result] = myRand(sample_size) % 生成指定大小的骰子点数样本 X = [1 2 3 4 5 6]; P = [1/6 1/6 1/6 1/6 1/6 1/6]; % 如果没有传入参数,默认生成100个样本 if nargin == 0 sample_size = 100; end result = randsample(X, sample_size, true, P); end
这样在simulate里可以根据需要调用myRand(100)或者其他数量,灵活性更高。
内容的提问来源于stack exchange,提问作者Gisu
相关产品推荐
相关产品推荐

