企业品牌文化建设学习网站,深圳推广平台深圳网络推广,沈阳网站维护,策划案推广给定非均匀012产生函数,构造均匀012产生函数。非均匀012产生函数的概率是未知的。
思路:拒绝采样
设产生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ÿ…
给定非均匀012产生函数,构造均匀012产生函数。非均匀012产生函数的概率是未知的。
思路:拒绝采样
设产生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;}