<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Random類 (java.util)         

    Random類中實現的隨機算法是偽隨機,也就是有規則的隨機。在進行隨機時,隨機算法的起源數字稱為種子數(seed), 在種子數的基礎上進行一定的變換,從而產生需要的隨機數字。

    相同種子數的Random對象,相同次數生成的隨機數字是完全相同的。也就是說,兩個種子數相同的 Random對象,第一次生成的隨機數字完全相同,第二次生成的隨機數字也完全相同。這點在生成多個隨機數字時需要特別注意。

    下面介紹一下Random類的使用,以及如何生成指定區間的隨機數組以及實現程序中要求的幾率。

    1、Random對象的生成

             Random類包含兩個構造方法,下面依次進行介紹:

             a、public Random()

    該構造方法使用一個和當前系統時間對應的相對時間有關的數字作為種子數,然后使用這個種子數構造Random 對象。

             b、public Random(long seed)

    該構造方法可以通過制定一個種子數進行創建。

    示例代碼:

    Random r = new Random();

    Random r1 = new Random(10);

    再次強調:種子數只是隨機算法的起源數字,和生成的隨機數字的區間無關。

    2、Random類中的常用方法

    Random類中的方法比較簡單,每個方法的功能也很容易理解。需要說明的是,Random類中各方法生成 的隨機數字都是均勻分布的,也就是說區間內部的數字生成的幾率是均等的。下面對這些方法做一下基本的介紹:

    a、public boolean nextBoolean()

    該方法的作用是生成一個隨機的boolean值,生成true和false的值幾率相等,也就是都是50% 的幾率。

    b、public double nextDouble()

    該方法的作用是生成一個隨機的double值,數值介于[0,1.0)之間。

    c、public int nextInt()

    該方法的作用是生成一個隨機的int值,該值介于int的區間,也就是-231到231-1之間。

    如果需要生成指定區間的int值,則需要進行一定的數學變換,具體可以參看下面的使用示例中的代碼。

    d、public int nextInt(int n)

    該方法的作用是生成一個隨機的int值,該值介于[0,n)的區間,也就是0到n之間的隨機int值,包含 0而不包含n。

    如果想生成指定區間的int值,也需要進行一定的數學變換,具體可以參看下面的使用示例中的代碼。

    e、public void setSeed(long seed)

    該方法的作用是重新設置Random對象中的種子數。設置完種子數以后的Random對象和相同種子數使用 new關鍵字創建出的Random對象相同。

    3、Random類使用示例

    使用Random類,一般是生成指定區間的隨機數字,下面就一一介紹如何生成對應區間的隨機數字。以下生成 隨機數的代碼均使用以下Random對象r進行生成:

    Random r = new Random();

    a、生成[0,1.0)區間的小數

                       double d1 = r.nextDouble();

    直接使用nextDouble方法獲得。

    b、生成[0,5.0)區間的小數

    double d2 = r.nextDouble() * 5;

    因為nextDouble方法生成的數字區間是[0,1.0),將該區間擴大5倍即是要求的區間。

    同理,生成[0,d)區間的隨機小數,d為任意正的小數,則只需要將nextDouble方法的返回值乘以 d即可。

    c、生成[1,2.5)區間的小數

           double d3 = r.nextDouble() * 1.5 + 1;

    生成[1,2.5)區間的隨機小數,則只需要首先生成[0,1.5)區間的隨機數字,然后將生成的隨機數區 間加1即可。

    同理,生成任意非從0開始的小數區間[d1,d2)范圍的隨機數字(其中d1不等于0),則只需要首先生成 [0,d2-d1)區間的隨機數字,然后將生成的隨機數字區間加上d1即可。

    d、生成任意整數

    int n1 = r.nextInt();

    直接使用nextInt方法即可。

    e、生成[0,10)區間的整數

    int n2 = r.nextInt(10);

    n2 = Math.abs(r.nextInt() % 10);

    以上兩行代碼均可生成[0,10)區間的整數。

    第一種實現使用Random類中的nextInt(int n)方法直接實現。

    第二種實現中,首先調用nextInt()方法生成一個任意的int數字,該數字和10取余以后生成的數字 區間為(-10,10),然后再對該區間求絕對值,則得到的區間就是[0,10)了。

    同理,生成任意[0,n)區間的隨機整數,都可以使用如下代碼:

    int n2 = r.nextInt(n);

    n2 = Math.abs(r.nextInt() % n);

    f、生成[0,10]區間的整數

    int n3 = r.nextInt(11);

    n3 = Math.abs(r.nextInt() % 11);

    相對于整數區間,[0,10]區間和[0,11)區間等價,所以即生成[0,11)區間的整數。

    g、生成[-3,15)區間的整數

    int n4 = r.nextInt(18) - 3;

    n4 = Math.abs(r.nextInt() % 18) - 3;

    生成非從0開始區間的隨機整數,可以參看上面非從0開始的小數區間實現原理的說明。

    h、幾率實現

    按照一定的幾率實現程序邏輯也是隨機處理可以解決的一個問題。下面以一個簡單的示例演示如何使用隨機數字實現幾率的邏 輯。

    在前面的方法介紹中,nextInt(int n)方法中生成的數字是均勻的,也就是說該區間內部的每個數字生成的幾率是相同的。那么如果生成一個[0,100)區間的隨機整數,則每個數字生成的幾率 應該是相同的,而且由于該區間中總計有100個整數,所以每個數字的幾率都是1%。按照這個理論,可以實現程序中的幾率問題。

    示例:隨機生成一個整數,該整數以55%的幾率生成1,以40%的幾率生成2,以5%的幾率生成3。實現的 代碼如下:

    int n5 = r.nextInt(100);

    int m; //結果數字

    if(n5 < 55){ //55個數字的區間,55%的幾率

    m = 1;

    }else if(n5 < 95){//[55,95),40個數字的區間,40%的幾率

    m = 2;

    }else{

    m = 3;

    }

    因為每個數字的幾率都是1%,則任意55個數字的區間的幾率就是55%,為了代碼方便書寫,這里使用 [0,55)區間的所有整數,后續的原理一樣。

    當然,這里的代碼可以簡化,因為幾率都是5%的倍數,所以只要以5%為基礎來控制幾率即可,下面是簡化的代 碼實現:

             int n6 = r.nextInt(20);

                  int m1;

                  if(n6 < 11){

                           m1 = 1;

                  }else if(n6 < 19){

                           m1= 2;

                  }else{

                           m1 = 3;

                  }

         在程序內部,幾率的邏輯就可以按照上面的說明進行實現。

    4、其它問題

    a、相同種子數Random對象問題

    前面介紹過,相同種子數的Random對象,相同次數生成的隨機數字是完全相同的,下面是測試的代碼:

                                Random r1 = new Random(10);

                                Random r2 = new Random(10);

                                for(int i = 0;i < 2;i++){

                                         System.out.println(r1.nextInt());

                                         System.out.println(r2.nextInt());

                                }

    在該代碼中,對象r1和r2使用的種子數都是10,則這兩個對象相同次數生成的隨機數是完全相同的。

    如果想避免出現隨機數字相同的情況,則需要注意,無論項目中需要生成多少個隨機數字,都只使用一個Random 對象即可。

    b、關于Math類中的random方法

    其實在Math類中也有一個random方法,該random方法的工作是生成一個[0,1.0)區間的隨 機小數。

    通過閱讀Math類的源代碼可以發現,Math類中的random方法就是直接調用Random類中的 nextDouble方法實現的。

    只是random方法的調用比較簡單,所以很多程序員都習慣使用Math類的random方法來生成隨機數 字。

    posted on 2010-06-27 10:46 Ying-er 閱讀(340) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲伊人久久大香线蕉结合| 免费人成在线观看播放a| 成年人视频在线观看免费| 成人亚洲国产精品久久| 亚洲精品午夜无码专区| 无人在线观看完整免费版视频| jizz中国免费| 精品久久久久久亚洲精品| 亚洲Av无码乱码在线观看性色 | 久久精品国产亚洲Aⅴ蜜臀色欲| 一级成人a毛片免费播放| 亚洲AV无码一区二区三区性色| 亚洲AV无码久久精品色欲| 女性自慰aⅴ片高清免费| 免费人成激情视频在线观看冫 | 精品无码无人网站免费视频 | 免费无码作爱视频| 亚洲性色AV日韩在线观看| 亚洲国产精品无码中文字| 国产成人免费一区二区三区| 亚洲视频免费在线观看| 看免费毛片天天看| 91亚洲国产成人久久精品| 亚洲日本va中文字幕久久| 国产成人免费a在线资源| 曰曰鲁夜夜免费播放视频| GOGOGO免费观看国语| 亚洲av无码专区在线观看下载| 亚洲视频中文字幕| 国产精品亚洲产品一区二区三区 | 18勿入网站免费永久| 精品国产呦系列在线观看免费| 亚洲日本在线电影| 亚洲国产精品美女| 亚洲AV无码一区二区二三区软件| 亚洲另类激情专区小说图片| 全免费一级午夜毛片| 黄页网站在线看免费| 美女内射无套日韩免费播放| 男女一进一出抽搐免费视频 | 精品女同一区二区三区免费播放|