一个国家所有的家庭都喜欢男孩,如果生了女孩孩,就继续生,直到有一个男孩了为止,问最后这个国家男女比例会出现什么变化?
可以用matlab模拟验证,代码如下:
1.由于要进行抽样决定生男生女,所以首先需要定义一个抽样函数
——————————————————————————————————
function sampNum = samp(number, prob, n)
% 用一定的概率抽取一系列序号(有放回抽样)
% sampNum = samp(number, prob, n)
% number为一列序号,prob为相应的抽取概率(和不需要归一化),n为抽取序列的长度
% 如果prob=[],则为等概率抽样
% sampNum为抽取的序号数组
% 检查参数
number = number(:);
prob = prob(:);
numLen = length(number);
if isempty(prob)
prob =
ones(numLen, 1);
end
if numLen ~= length(prob)
error('the
size of prob is wrong')
end
% 抽取
sampNum = zeros(1, n);
randomDot = unifrnd(0, sum(prob), 1, n);
dividPoint = cumsum(prob);
for j = 1 : n
d =
randomDot(j) - dividPoint;
m = find(d
> 0);
sampNum(j) =
number( length(m) + 1 );
end
end
————————————————————————————————————
这个抽样函数的目的是进行随机抽样,可以保存在当前路径中。
2.然后在命令窗口中输入:
——————————————————————————————————————
numFamily =
1000; %设定模拟家庭的数量
bNum = zeros(1,
numFamily); %预先定义数组,保存每个家庭的男孩女孩数量
gNum = zeros(1, numFamily);
for i = 1 :
numFamily %开始模拟
boy = 0;
girl = 0;
while boy == 0
sampNum = samp([1 2], [], 1); %等概率抽样,抽到1生男孩,抽到2生女孩
if sampNum == 1
boy = boy + 1;
else
girl = girl + 1;
end
end
bNum(i) = boy;
gNum(i) = girl;
end
ratio = sum(bNum)/sum(gNum)
——————————————————————————————————————————
我模拟了1000个家庭,结果男女比例为0.99,意外么?