1 2 3 4 5 6 7 8 9 10 11 12 13
| public static int discrete(double[] a) { double r = StdRandom.random(); double sum = 0.0; for(int i=0;i < a.length;i++) { sum = sum + a[i]; if(sum >= r) return i; } return -1; } 这个我们要好好理解一下,因为r是一个均匀分布在0,1上,所以这里的i就相当于r一样,我们比如说a[n]=[0.2,0.3,0,5] 那么显然0.5的概率最大,也就是取i=2的概率应该最大,其实就是我们选取r的时候,r落在后面的概率就大,比如r>0.5时,就要把三个概率全加上就满足,这时候就返回2,所以说全加上的概率就是返回2的概率,而恰好全加上的概率就是r>0.5的概率,也就是0.5,恰好相等。 再举个例子,比如r>0.2且r<0.5,我们想要返回i=1,那么我们想要返回i=1的概率是0.3,如何实现呢,其实也就是概率分布的p(X<x)=0.2+0.3注意这里此时x=2这样就能保证X的取值不可能返回2,但是返回0,1两个,这也不行,我们要他只返回值为1,不返回0,所以还要再限制X的范围到X>0,而再前面的p(X<=0)的概率我们都知道了是X=0的概率也就是0.2,所以取X=1的概率就是0.3
|