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

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

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

    dream.in.java

    能以不變應萬變是聰明人做事的準則。萬事從小事做起,積累小成功,問鼎大成功,是成功者的秘訣。

    JAVA認證培訓輔導:隨機整數(shù)的生成

    使用Java 2 SDK基礎(chǔ)類庫產(chǎn)生隨機數(shù)的方法很多。但是如果你跟不上這些類庫的更新腳步,你有可能正在使用的是一種低效的隨機數(shù)生成機制,更糟糕的是:你有可能得到的不是均勻分布的隨機數(shù)。本文將向你展示一種較為可靠的隨機數(shù)生成方法,同時與其他方法進行比較。

      自從JDK最初版本發(fā)布起,我們就可以使用java.util.Random類產(chǎn)生隨機數(shù)了。在JDK1.2中,Random類有了一個名為nextInt()的方法:

      public int nextInt(int n)

      給定一個參數(shù)n,nextInt(n)將返回一個大于等于0小于n的隨機數(shù),即:0 <= nextInt(n) < n。

      你所要做的就是先聲明一個Random的對象,在調(diào)用其nextInt(n)函數(shù)以返回隨機值。

      這里有個示例,下面的代碼段將生成很多隨機數(shù)并輸出它們的平均值:

    以下是引用片段:
      int count = 1000000;
      int range = Integer.MAX_VALUE / 3 * 2;
      double sum = 0;
      Random rand = new Random();
      for (int i=0; i 
      sum += rand.nextInt(range);
      }
      System.out.println(sum/count);


      執(zhí)行了1000000次循環(huán)之后,得到的平均值基本上就處于隨機數(shù)范圍的中點(midpoint)。

      到目前為止,事情還并不復雜,但是我們會問為什么要使用nextInt(n)?考慮一下的隨機數(shù)生成方法:

      (1)使用老的方法nextInt(),沒有制定數(shù)值范圍

      (2)用Math.abs()靜態(tài)函數(shù)得到(1)中產(chǎn)生值的絕對值

      (3)對(2)的結(jié)果進行取模運算(%),得到期望范圍類的值

      我們說nextInt(n)要比上述方法更好,為什么呢?參考以下的代碼段:

    以下是引用片段:
      sum = 0;
      for (int i=0; i 
      sum += Math.abs(rand.nextInt()) % range;
      }
      System.out.println(sum/count);


      不難發(fā)現(xiàn),每次循環(huán)都多出了幾步運算。事實上,這種隨機數(shù)生成的方法存在著以下三個問題:

      首先,nextInt()返回的值是趨于均勻分布在Integer.MIN_VALUE 和 Integer.MAX_VALUE之間的。如果你取Integer.MIN_VALUE的絕對值,得到的仍然不是一個正數(shù)。事實上,Math.abs(Integer.MIN_VALUE)等于Integer.MIN_VALUE。因此,存在著這樣一種情況(雖然很少見):rand.nextInt()=Integer.MIN_VALUE,經(jīng)過取絕對值Math.abs(rand.nextInt())之后,得到是一個負數(shù)。這種幾率為 1/(2^31),在我們的測試中不太可能發(fā)生——循環(huán)次數(shù)只有1000000次。

      其次,當你對nextInt()取模時,你使結(jié)果的隨機性大打折扣。隨機數(shù)中較小的值出現(xiàn)的幾率更大一些。這就是眾所周知的偽隨機數(shù)生成,因此我們不是用取模的方法。

      最后,也可能是最糟糕的:隨機數(shù)不是均勻分布。如果你執(zhí)行了上述的兩段代碼,第一段代碼的結(jié)果將會大于715,000,000,考慮到數(shù)值范圍的中點(midpoint)是715,827,882,所以這是一個可以接受的結(jié)果。然而,你會吃驚的發(fā)現(xiàn)第二段代碼得到的平均值肯定不會超過600,000,000。

      為何第二段代碼的結(jié)果會如此的偏差?糾其本質(zhì),問題出在數(shù)值分布的不均勻。當你進行取模運算時,你將過大的數(shù)轉(zhuǎn)換成了較小的。這使得較小的數(shù)更容易產(chǎn)生。

      使用nextInt(range)將會解決上述的三個問題。

      還有一種隨機數(shù)生成方法——使用Math.random()。這個方法的效果如何?

    以下是引用片段:
      sum = 0;
      for (int i=0; i 
      sum += (int)(Math.random() * range);
      }
      System.out.println(sum/count);


      很好,使用random()不會碰到nextInt()的麻煩。你不會得到負數(shù)返回值,沒有使用取模運算,值分布也是均勻的。還有什么問題嗎?你有沒有考慮到Math.random()使用了浮點運算,而nextInt()和nextInt(range)只有整數(shù)操作?Math.random()可能會慢上四倍。再加上從浮點到整數(shù)的類型轉(zhuǎn)換,整個運算將會更慢。

      好了,經(jīng)過一番比較,我們發(fā)現(xiàn)使用nextInt(range)生成隨機數(shù)更為有效,因為它避免了其他方法的種種弊端。

      最后再給出一段代碼,通過測試可以比較本文提到的幾種隨機數(shù)生成方法。

    以下是引用片段:
      import java.util.*;
      import java.text.*;
      public class RandomTest {
      public static void main(String args[]) {
      NumberFormat nf = NumberFormat.getInstance();
      int count = 1000000;
      int range = Integer.MAX_VALUE / 3 * 2;
      System.out.println("Midpoint: " + nf.format(range/2));
      double sum = 0;
      Random rand = new Random();
      for (int i=0; i 
      sum += rand.nextInt(range);
      }
      System.out.println("Good : " + nf.format(sum/count));
      sum = 0;
      for (int i=0; i 
      sum += Math.abs(rand.nextInt()) % range;
      }
      System.out.println("Bad : " + nf.format(sum/count));
      sum = 0;
      for (int i=0; i 
      sum += (int)(Math.random() * range);
      }
      System.out.println("Longer : " + nf.format(sum/count));
      }
      }

    posted on 2009-03-28 19:07 YXY 閱讀(127) 評論(0)  編輯  收藏


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲日韩人妻第一页| 亚洲免费视频网站| a毛片在线免费观看| 91精品国产亚洲爽啪在线影院 | 国产亚洲真人做受在线观看| 日韩插啊免费视频在线观看| 中中文字幕亚洲无线码| 99re6热视频精品免费观看| 77777亚洲午夜久久多人| 99久久精品国产免费| 亚洲av色香蕉一区二区三区| 亚洲小说区图片区另类春色| 中文字幕无码视频手机免费看| 亚洲视屏在线观看| 国产又大又黑又粗免费视频| 久久综合亚洲色hezyo| 亚洲av无码国产精品夜色午夜| a级毛片黄免费a级毛片| 亚洲自偷自偷在线成人网站传媒 | 亚洲中文字幕无码亚洲成A人片| 最近更新免费中文字幕大全| 亚洲AV无码乱码精品国产| 亚洲精品美女久久久久| 中文字幕无码免费久久99| 亚洲一级视频在线观看| **真实毛片免费观看| 亚洲国产精品VA在线观看麻豆| 国产亚洲精品欧洲在线观看| 亚洲欧洲精品成人久久奇米网| 亚洲综合久久精品无码色欲| 女人让男人免费桶爽30分钟| 亚洲宅男天堂a在线| 卡一卡二卡三在线入口免费| 美女免费精品高清毛片在线视| 成年女人免费v片| 亚洲日韩在线观看免费视频| 亚洲AV无码成人网站久久精品大| 国产91成人精品亚洲精品| 亚洲av无码国产精品夜色午夜| 99免费精品视频| 亚洲真人无码永久在线观看|