设产生0、1、2的概率分别是
p
p
p、
q
q
q、
r
r
r,
p
>
0
,
q
>
0
,
r
>
0
p>0,q>0,r>0
p>0,q>0,r>0,
p
+
q
+
r
=
1
p+q+r=1
p+q+r=1。
那么产生3个数,且0、1、2均恰好产生一次的概率为
p
q
r
pqr
pqr,这些概率是均等的。
亦即产生012、021、102、120、201、210的概率是相同的。
因此可以连续产生3个数,判断产生的是否是这几种之一,把其他的抛弃。那么,剩下的模式每一种产生的概率为
p
q
r
pqr
pqr,是均等的。
由于0、1、2在剩下的模式中任一位置产生的概率均为三分之一,因此任意返回一个位置的数即可。
代码
#include<iostream>usingnamespace std;intrand012();//non-uniform 0, 1, 2boollegal(int a,int b,int c){return a != b && b != c && a != c;}intuni_rand012(){//uniform 0,1,2int a, b, c;do{
a =rand012();
b =rand012();
c =rand012();}while(!legal(a, b, c));return a;}