rand5表示生成隨機數1,2,3,4,5java
rand7表示生成隨機數1,2,3,4,5,6,7markdown
要經過rand5構造rand7如今可能沒有什麼思路,咱們先試着用rand7生成rand5app
rand7生成rand5很簡單,把6和7排除掉就是rand5了,也就是當隨機到大於5的時候,就再隨機一次,直到小於等於5dom
代碼寫起來很容易post
public static int rand5(){
Random ra =new Random();
int result = ra.nextInt(7)+1;
while (result > 5){
result = ra.nextInt(7)+1;
}
return result;
}
這時咱們能夠用一樣的思路,先利用rand5把範圍放大,而後再排除掉超出的範圍ui
這裏咱們用這樣的一個公式:newRand = n * (Randn – 1) + Randn
,這個公式能夠保證新的隨機數中每一個的機率是相同的(能夠本身試試其餘構造方式,你會發現有的結果中每一個數的機率是不一樣的)url
好比rand5,newRand = 5×(Rand5-1)+ Rand5,那麼newRand的範圍就是1-25spa
若是你擴大了一次範圍以後仍是比目標範圍小,那麼就再將newRand擴大一下newRand2 = n * (newRand – 1) + Randn
code
這時rand5以及擴大到rand25了,接下來把範圍縮小,若是直接排除的話,要除去8-25,這個範圍太大了blog
因此咱們找到比25小的最近的7的倍數21
咱們把隨機數縮小的1-21後,再除以7取餘數+1,這樣獲得的結果就是1-7了
public static int rand7(){
int result = 25;
while (result > 21){
result = 5*(rand5()-1)+rand5();
}
return result%7+1;
}