調用這個Math.Random()函數可以返回帶正號的double值,取值範圍是[0.0,1.0)的左閉右開區間,並在該範圍內(近似)均勻分佈。java
示例代碼:算法
package com.random; import java.util.Random; import org.junit.After; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; public class testRandom { private static Random r1; private static Random r2; /** * @Title: loadUp * @Description: 測試以前的初始化工做 */ @BeforeClass public static void loadUp() { r1 = new Random(10); r2 = new Random(10); } @After public void testAfter() { System.out.println("------------------------>"); } /** * @Title: testMathRandom * @Description: 經過Math.random產生[0,5)之間的數 * @throws */ @Ignore @Test public void testMathRandom() { for (int i = 0; i < 20; i++) { System.out.println((int) (Math.random() * 5)); } } /** * @Title: testTwoRandom * @Description: 兩個random對象,具備相同的種子,會產生相同的隨機數(僞隨機) */ @Test public void testTwoRandom() { for (int i = 0; i < 10; ++i) { Assert.assertEquals(r1.nextInt(), r2.nextInt()); } } /** * @Title: testRandom1 * @Description: 產生[1,2.5)之間的數的,有公式 nextDouble()*(b-a)+a * @param 設定文件 * @return void 返回類型 * @throws */ @Test @Ignore public void testRandom1() { for (int i = 0; i < 10; ++i) { System.out.println(r1.nextDouble() * 1.5 + 1); } } /** * @Title: testRandom2 * @Description: 產生[0,10)的兩種方法,生成[0,n)區間的數有公式Math.abs(nextInt()%n)和nextInt(n) */ @Test @Ignore public void testRandom2() { for (int i = 0; i < 10; ++i) { System.out.println("方法一: " + r1.nextInt(10)); System.out.println("方法二: " + Math.abs(r2.nextInt() % 10)); } } /** * @Title: testNextBoolean * @Description: 生成一個隨機的boolean值,true和false值均等 */ @Test @Ignore public void testNextBoolean() { for (int i = 0; i < 10; ++i) { System.out.println(r1.nextBoolean()); } } /** * @Title: testNextInt * @Description: 生成一個-2^31~2^31-1之間的隨機數 */ @Test @Ignore public void testNextInt() { for (int i = 0; i < 10; ++i) { System.out.println(Math.abs(r1.nextInt()));// 0~2^31-1 System.out.println(r1.nextInt());// -2^31~2^31-1 System.out.println(r1.nextInt(10));// [0,10),參數10爲隨機生成數字的上限 } } /** * @Title: testNextDouble * @Description: 隨機生成[0,1.0)區間的小數 */ @Test @Ignore public void testNextDouble() { for (int i = 0; i < 10; ++i) { System.out.println(r1.nextDouble()); } } /** * @Title: testRandom3 * @Description: 生成任意區間[a,b),公式nextInt(b-a)+a和Math.abs(nextInt()%(b-a)+a),例如區間[-3,15) */ @Test @Ignore public void testRandom3() { for (int i = 0; i < 100; ++i) { System.out.println(r1.nextInt(18) - 3); System.out.println(Math.abs(r1.nextInt()%18)-3); } } /** * @Title: testRandom4 * @Description: 生成任意區間[a,b],公式nextInt(b+1-a)+a和Math.abs(nextInt()%(b+1-a)+a),例如區間[3,10] */ @Test public void testRandom4(){ for(int i=0;i<20;++i){ System.out.println(r1.nextInt(8)+3); } } }
在前面的方法介紹中,nextInt(int n)方法中生成的數字是均勻的,也就是說該區間內部的每一個數字生成的概率是相同的。那麼若是生成一個[0,100)區間的隨機整數,則每一個數字生成的概率應該是相同的,並且因爲該區間中總計有100個整數,因此每一個數字的概率都是1%。按照這個理論,能夠實現程序中的概率問題。數組
示例代碼:dom
@Test public void testRandom5() { for (int i = 0; i < 100; ++i) { int a = r1.nextInt(100); if (a < 55) { System.out.println("1");// 55%的概率 } else if (a < 95) { System.out.println("2");// 40%的概率 } else { System.out.println("3");// 5%的概率 } } }