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

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

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

    Random類 (java.util)         

    Random類中實(shí)現(xiàn)的隨機(jī)算法是偽隨機(jī),也就是有規(guī)則的隨機(jī)。在進(jìn)行隨機(jī)時(shí),隨機(jī)算法的起源數(shù)字稱為種子數(shù)(seed), 在種子數(shù)的基礎(chǔ)上進(jìn)行一定的變換,從而產(chǎn)生需要的隨機(jī)數(shù)字。

    相同種子數(shù)的Random對象,相同次數(shù)生成的隨機(jī)數(shù)字是完全相同的。也就是說,兩個(gè)種子數(shù)相同的 Random對象,第一次生成的隨機(jī)數(shù)字完全相同,第二次生成的隨機(jī)數(shù)字也完全相同。這點(diǎn)在生成多個(gè)隨機(jī)數(shù)字時(shí)需要特別注意。

    下面介紹一下Random類的使用,以及如何生成指定區(qū)間的隨機(jī)數(shù)組以及實(shí)現(xiàn)程序中要求的幾率。

    1、Random對象的生成

             Random類包含兩個(gè)構(gòu)造方法,下面依次進(jìn)行介紹:

             a、public Random()

    該構(gòu)造方法使用一個(gè)和當(dāng)前系統(tǒng)時(shí)間對應(yīng)的相對時(shí)間有關(guān)的數(shù)字作為種子數(shù),然后使用這個(gè)種子數(shù)構(gòu)造Random 對象。

             b、public Random(long seed)

    該構(gòu)造方法可以通過制定一個(gè)種子數(shù)進(jìn)行創(chuàng)建。

    示例代碼:

    Random r = new Random();

    Random r1 = new Random(10);

    再次強(qiáng)調(diào):種子數(shù)只是隨機(jī)算法的起源數(shù)字,和生成的隨機(jī)數(shù)字的區(qū)間無關(guān)。

    2、Random類中的常用方法

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

    a、public boolean nextBoolean()

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

    b、public double nextDouble()

    該方法的作用是生成一個(gè)隨機(jī)的double值,數(shù)值介于[0,1.0)之間。

    c、public int nextInt()

    該方法的作用是生成一個(gè)隨機(jī)的int值,該值介于int的區(qū)間,也就是-231到231-1之間。

    如果需要生成指定區(qū)間的int值,則需要進(jìn)行一定的數(shù)學(xué)變換,具體可以參看下面的使用示例中的代碼。

    d、public int nextInt(int n)

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

    如果想生成指定區(qū)間的int值,也需要進(jìn)行一定的數(shù)學(xué)變換,具體可以參看下面的使用示例中的代碼。

    e、public void setSeed(long seed)

    該方法的作用是重新設(shè)置Random對象中的種子數(shù)。設(shè)置完種子數(shù)以后的Random對象和相同種子數(shù)使用 new關(guān)鍵字創(chuàng)建出的Random對象相同。

    3、Random類使用示例

    使用Random類,一般是生成指定區(qū)間的隨機(jī)數(shù)字,下面就一一介紹如何生成對應(yīng)區(qū)間的隨機(jī)數(shù)字。以下生成 隨機(jī)數(shù)的代碼均使用以下Random對象r進(jìn)行生成:

    Random r = new Random();

    a、生成[0,1.0)區(qū)間的小數(shù)

                       double d1 = r.nextDouble();

    直接使用nextDouble方法獲得。

    b、生成[0,5.0)區(qū)間的小數(shù)

    double d2 = r.nextDouble() * 5;

    因?yàn)閚extDouble方法生成的數(shù)字區(qū)間是[0,1.0),將該區(qū)間擴(kuò)大5倍即是要求的區(qū)間。

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

    c、生成[1,2.5)區(qū)間的小數(shù)

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

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

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

    d、生成任意整數(shù)

    int n1 = r.nextInt();

    直接使用nextInt方法即可。

    e、生成[0,10)區(qū)間的整數(shù)

    int n2 = r.nextInt(10);

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

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

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

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

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

    int n2 = r.nextInt(n);

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

    f、生成[0,10]區(qū)間的整數(shù)

    int n3 = r.nextInt(11);

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

    相對于整數(shù)區(qū)間,[0,10]區(qū)間和[0,11)區(qū)間等價(jià),所以即生成[0,11)區(qū)間的整數(shù)。

    g、生成[-3,15)區(qū)間的整數(shù)

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

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

    生成非從0開始區(qū)間的隨機(jī)整數(shù),可以參看上面非從0開始的小數(shù)區(qū)間實(shí)現(xiàn)原理的說明。

    h、幾率實(shí)現(xiàn)

    按照一定的幾率實(shí)現(xiàn)程序邏輯也是隨機(jī)處理可以解決的一個(gè)問題。下面以一個(gè)簡單的示例演示如何使用隨機(jī)數(shù)字實(shí)現(xiàn)幾率的邏 輯。

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

    示例:隨機(jī)生成一個(gè)整數(shù),該整數(shù)以55%的幾率生成1,以40%的幾率生成2,以5%的幾率生成3。實(shí)現(xiàn)的 代碼如下:

    int n5 = r.nextInt(100);

    int m; //結(jié)果數(shù)字

    if(n5 < 55){ //55個(gè)數(shù)字的區(qū)間,55%的幾率

    m = 1;

    }else if(n5 < 95){//[55,95),40個(gè)數(shù)字的區(qū)間,40%的幾率

    m = 2;

    }else{

    m = 3;

    }

    因?yàn)槊總€(gè)數(shù)字的幾率都是1%,則任意55個(gè)數(shù)字的區(qū)間的幾率就是55%,為了代碼方便書寫,這里使用 [0,55)區(qū)間的所有整數(shù),后續(xù)的原理一樣。

    當(dāng)然,這里的代碼可以簡化,因?yàn)閹茁识际?span>5%的倍數(shù),所以只要以5%為基礎(chǔ)來控制幾率即可,下面是簡化的代 碼實(shí)現(xiàn):

             int n6 = r.nextInt(20);

                  int m1;

                  if(n6 < 11){

                           m1 = 1;

                  }else if(n6 < 19){

                           m1= 2;

                  }else{

                           m1 = 3;

                  }

         在程序內(nèi)部,幾率的邏輯就可以按照上面的說明進(jìn)行實(shí)現(xiàn)。

    4、其它問題

    a、相同種子數(shù)Random對象問題

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

                                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使用的種子數(shù)都是10,則這兩個(gè)對象相同次數(shù)生成的隨機(jī)數(shù)是完全相同的。

    如果想避免出現(xiàn)隨機(jī)數(shù)字相同的情況,則需要注意,無論項(xiàng)目中需要生成多少個(gè)隨機(jī)數(shù)字,都只使用一個(gè)Random 對象即可。

    b、關(guān)于Math類中的random方法

    其實(shí)在Math類中也有一個(gè)random方法,該random方法的工作是生成一個(gè)[0,1.0)區(qū)間的隨 機(jī)小數(shù)。

    通過閱讀Math類的源代碼可以發(fā)現(xiàn),Math類中的random方法就是直接調(diào)用Random類中的 nextDouble方法實(shí)現(xiàn)的。

    只是random方法的調(diào)用比較簡單,所以很多程序員都習(xí)慣使用Math類的random方法來生成隨機(jī)數(shù) 字。

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产亚洲精品成人AA片新蒲金 | 亚洲精品国产精品国自产观看| 水蜜桃亚洲一二三四在线| 日本一道本不卡免费 | 亚洲国产AV一区二区三区四区 | 国产成人va亚洲电影| 国产在线观看免费视频软件 | 亚洲男人的天堂网站| 成人最新午夜免费视频| 免费网站看av片| 亚洲中文字幕无码专区| 免费国产成人午夜在线观看| 久久精品国产亚洲精品2020| 九九免费精品视频在这里| 亚洲夜夜欢A∨一区二区三区| 日韩一级片免费观看| 久久99国产亚洲高清观看首页| 亚洲成aⅴ人在线观看| a国产成人免费视频| 亚洲卡一卡2卡三卡4卡无卡三| 亚洲videos| 3344永久在线观看视频免费首页| 亚洲精品色午夜无码专区日韩| jzzjzz免费观看大片免费| 久久亚洲AV成人无码电影| 十八禁在线观看视频播放免费| 日韩va亚洲va欧洲va国产| 成人看的午夜免费毛片| 精品熟女少妇aⅴ免费久久| 亚洲欧洲日产国码在线观看| 免费人成视频x8x8入口| 一级做a爰全过程免费视频| 亚洲精品和日本精品| 日韩亚洲人成网站| 亚洲国产精品一区| 亚洲电影在线免费观看| 亚洲丁香色婷婷综合欲色啪| 国产成人涩涩涩视频在线观看免费| 亚洲av日韩av天堂影片精品| 91精品成人免费国产| 噜噜噜亚洲色成人网站∨|