N= length(weight); N_babies= zeros(1,N); q_res = N.*weight; N_babies = fix(q_res); N_res=N-sum(N_babies); if (N_res~=0) q_res=(q_res-N_babies)/N_res; cumDist= cumsum(q_res); u = fliplr(cumprod(rand(1,N_res).^(1./(N_res:-1:1)))); j=1; for i=1:N_res while (u(1,i)>cumDist(1,j)) j=j+1; end N_babies(1,j)=N_babies(1,j)+1; end end index=1; for i=1:N if (N_babies(1,i)>0) for j=index:index+N_babies(1,i)-1 outIndex(j) = i; end end index= index+N_babies(1,i); end
时间: 2024-03-30 21:34:10 浏览: 52
wonders G1 books
这段代码的作用是根据权重数组 weight,随机生成一个输出索引数组 outIndex,使得每个元素被选中的概率与其对应的权重成正比。
具体实现过程如下:
1. 统计权重数组的长度,N = length(weight)。
2. 初始化新生儿数量数组 N_babies 为全零,N_babies = zeros(1, N)。
3. 计算每个元素被选中的期望次数,q_res = N .* weight。
4. 取整得到每个元素实际被选中的次数,N_babies = fix(q_res)。
5. 计算剩余可分配数量,N_res = N - sum(N_babies)。
6. 如果有剩余数量需要分配,则计算剩余数量的期望次数,q_res = (q_res - N_babies) / N_res,并计算剩余数量的累积分布,cumDist = cumsum(q_res)。
7. 生成随机数数组 u,u = fliplr(cumprod(rand(1, N_res).^(1./(N_res:-1:1))))。
8. 初始化计数器 j 为 1,分配剩余数量,while (u(1, i) > cumDist(1, j)),N_babies(1, j) = N_babies(1, j) + 1。
9. 初始化输出索引数组的起始位置为 1,index = 1。
10. 根据每个元素被选中的次数,将其对应的索引添加到输出索引数组中,for i=1:N,for j=index:index+N_babies(1,i)-1,outIndex(j) = i。
11. 更新索引计数器,index= index+N_babies(1,i)。
最终,输出的 outIndex 数组中每个元素的出现次数应该与其对应的权重成正比。
阅读全文