由隨機數rand5實現隨機數rand7

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) + Randncode

這時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;

}
相關文章
相關標籤/搜索