http://www.reibang.com/p/6d9b3e8df760
思路:
1、random5 只生成1饱狂、2曹步、3、4休讳、5箭窜,每個字符概率相同,1衍腥、2磺樱、3、4的概率相同婆咸,生成5時拋棄并重新生成竹捉,即為random4
2、將random5擴大到randomN尚骄,N>7块差,即可實現(xiàn)random7
考慮以下公式:
5 * random5() - random5() + 1
被減數(shù)5*random5()
會等概率生成5
、10
倔丈、15
憨闰、20
、25
需五,與減數(shù)random5()
互為獨立事件鹉动,所以5 * random5() - random5()
會等概率生成0~24
,+1
后可等概率生成1~25
宏邮,即得到random25
泽示。
拋棄>7
的數(shù)據(jù)可得到random7
,然而重復(fù)次數(shù)太多蜜氨。
拋棄22
械筛、23
、24
飒炎、25
的結(jié)果得到random21
并利用以下公式改造:
random21() % 7 + 1
即為random7
完整代碼:
static int random5(){
return (int)(Math.random() * 5 + 1);
}
static int random7(){
int rnd = 0;
do{
rnd = 5 * random5() - random5() + 1;
}while (rnd > 21);
return rnd % 7 + 1;
}
public static void main(String[] args) {
// 生成100萬次統(tǒng)計概率
Map<Integer, Integer> counter = new HashMap<>();
for(int i = 0 ; i < 1000000 ; i ++){
int rnd = random7();
counter.putIfAbsent(rnd, 0);
counter.put(rnd, counter.get(rnd) + 1);
}
for(Integer k : counter.keySet()){
System.out.println(k + ":" + counter.get(k)/1000000d);
}
}
輸出結(jié)果:
1:0.119899
2:0.159701
3:0.160182
4:0.159896
5:0.159997
6:0.119782
7:0.120543