R = randsample([1 2 3], N, true, [0.3 0.1 0.2])
a = 1:3; %# possible numbers
w = [0.3 0.1 0.2]; %# corresponding weights
N = 10; %# how many numbers to generate
R = a( sum( bsxfun(@ge, rand(N,1), cumsum(w./sum(w))), 2) + 1 )
说明:
考虑间隔[0,1]。我们为列表(1:3)中的每个元素分配与每个元素的权重成比例的长度的子间隔;因此1个取值和间隔长度为0.3 /(0.3±0.1±0.2),与其他值相同。
现在如果我们在[0,1]上产生具有均匀分布的随机数,则[0,1]中的任何数字具有相等的被选择的概率,因此子间隔的长度决定随机数落入的概率每个间隔。
这匹配我在上面做的:选择一个数字X〜U [0,1](更像N个数字),然后以矢量化的方式找到它落入的间隔。
您可以通过生成足够大的序列N = 1000来检查上述两种技术的结果:
>> tabulate( R )
Value Count Percent
1 511 51.10%
2 160 16.00%
3 329 32.90%
它们或多或少地符合标准化权重w./sum(w)[0.5 0.16667 0.33333]