前言
本文主要介紹如何根據(jù)不相等概率[0,1]設(shè)計(jì)出相等概率的[0,1]洽胶。
給定一個(gè)方法func1,這個(gè)方法返回0的概率為p裆馒,返回1的概率為1-p姊氓。
現(xiàn)在要根據(jù)func1這個(gè)方法,設(shè)計(jì)出一個(gè)新的方法func2喷好,該方法返回0和1的概率都為50%翔横。
func1代碼如下:
public static int func1() {
return Math.random() < 0.7 ? 0 : 1;
}
復(fù)制代碼
思路解析
先來看一下func1這個(gè)方法,通過這個(gè)方法我們可以得出幾個(gè)信息:
方法不可更改梗搅,只能被調(diào)用禾唁。
方法只返回0 和 1,我們并不知道0和1的概率是多少无切。
要想辦法從func1中荡短,得出2個(gè)概率相等的數(shù)字。
func1方法中的內(nèi)容我們不能更改哆键,而且方法里面的 0.7也有可能是其他的掘托,只知道是固定的,但具體多少也無法得知籍嘹,只能得到0和1闪盔。
要設(shè)計(jì)的func2方法也是返回0和1,但是0和1的概率是相同的辱士,都為50%锭沟。
那怎么利用func1方法來實(shí)現(xiàn)呢?
組合概率
其實(shí)實(shí)現(xiàn)方法也很簡單识补,只需要調(diào)用兩次func1方法方法就能得到兩個(gè)相同的概率數(shù)字族淮,我們一起來分析一下。
func1方法可以得到0和1,調(diào)用兩次func1方法可以得到哪些組合呢祝辣?
調(diào)用兩次func1方法得到的數(shù)據(jù)組合為:00贴妻、01、10蝙斜、11名惩。
再來看下00、01孕荠、10娩鹉、11這四組數(shù)的概率分別為:pp、p(1-p)稚伍、(1-p)p弯予、(1-p)(1-p)。
可以看到个曙,雖然我們不知道概率p到底是多少锈嫩,但至少01、10這兩組數(shù)的概率是相同的都是p(1-p)垦搬。
組合概率00pp01p(1-p)10(1-p)p11(1-p)*(1-p)
由此可以得出呼寸,我們只要調(diào)用兩次func1方法,如果生成的是00或11猴贰,就讓他重新生成对雪,如果生成的是01或10直接返回即可。
代碼實(shí)現(xiàn)
經(jīng)過上面的分析米绕,對(duì)func2方法的實(shí)現(xiàn)如下:
public static int func2() {
int res, tmp;
do {
res = func1();
tmp = func1();
} while (res == tmp);
return res;
}
復(fù)制代碼
概率驗(yàn)證
怎么驗(yàn)證一下func2方法返回的0和1是不是等概率的呢瑟捣?
驗(yàn)證思路如下:
初始化一個(gè)數(shù)組arr,用來存放 0和1 被調(diào)用的次數(shù)义郑。
設(shè)置一個(gè)循環(huán)1千萬次蝶柿,來調(diào)用func2()這個(gè)方法丈钙。
對(duì)比數(shù)組arr中0和1元素的個(gè)數(shù)非驮。
如果0和1元素的個(gè)數(shù)大致相同的話,說明func2()方法返回的0和1是等概率的雏赦。
驗(yàn)證代碼如下:
public static void main(String[] args) {
int times = 10000000;
int[] arr = new int[2];
for (int i = 0; i < times; i++) {
int res = func2();
arr[res]++;
}
System.out.println("元素: 0, 出現(xiàn)的次數(shù)為: " + arr[0]);
System.out.println("元素: 1, 出現(xiàn)的次數(shù)為: " + arr[1]);
}
復(fù)制代碼
多運(yùn)行幾次驗(yàn)證方法劫笙,可以發(fā)現(xiàn)0和1的次數(shù)是差不多的,也就是說func2()方法返回的0和1是等概率的星岗。
運(yùn)行結(jié)果如下:
元素: 0, 出現(xiàn)的次數(shù)為: 5002123
元素: 1, 出現(xiàn)的次數(shù)為: 4997877
復(fù)制代碼
總結(jié)
本文主要介紹如何根據(jù)不相等概率[0,1]設(shè)計(jì)出相等概率的[0,1]填大。
其中主要思想就是根據(jù)不相等概率的[0,1]通過組合來生成包含相同概率的兩組數(shù)的結(jié)果00、01俏橘、10允华、11,然后從這4組數(shù)中只返回相同概率的01和10,如果生成的是00和11就讓他重新再生成直到生成01和10靴寂。
當(dāng)然磷蜀,解決方法不可能只有這一種,如果你有更好的方法百炬,歡迎在評(píng)論區(qū)留言交流~褐隆。