Math.random()和new Random()生成隨機數

Java中Math類的random()方法可以生成[0,1)之間的隨機浮點數。而double類型數據強制轉換成int類型,整數部分賦值給int類型變量,小數點之後的小數部分將會丟失。

如果要生成[0,n]的隨機整數的話,只需要Math.random()乘以n+1,生成[0,n+1)的浮點數,再強制類型轉換爲int類型,只取其整數部分,即可得到[0,n]的整數;new Random().nextInt(m)表示生成[0,m-1]之間的隨機數,也就是說new Random().nextInt(m+1),將生成[0,m]之間的隨機整數。

Math.ramdom() 和 new Random()生成[m,n]的隨機整數:

(int)(Math.random()*m); //生成[0,m]之間的隨機整數。
m+(int)(Math.random()*(n+1-m)); //生成從m到n的隨機整數[m,n]

Random random = new Random();
random.nextInt(m+1); //生成[0,m]之間的隨機整數。
m+random.nextInt(n+1-m); //生成從m到n的隨機整數[m,n]


測試每個生成的隨機數的概率:
 

public class TestMath
{
    public static void main(String[] args)
    {  
        int[] count=new int[10];
        int base=1000000000;
        int b;
        for(int i=0;i<base;i++)
        { 
            //生成[0,9]
            b=(int)(Math.random()*10);
            if(b<0)
                break;
            if (b>9)
            {
                break;
            }
            switch (b)
            {
                case 0:
                    count[0]++;
                    break;
                case 1:
                    count[1]++;
                    break;
                case 2:
                    count[2]++;
                    break;
                case 3:
                    count[3]++;
                    break;
                case 4:
                    count[4]++;
                    break;
                case 5:
                    count[5]++;
                    break;
                case 6:
                    count[6]++;
                    break;
                case 7:
                    count[7]++;
                    break;
                case 8:
                    count[8]++;
                    break;
                case 9:
                    count[9]++;
                    break;
            }
        }
        for(int i=0;i<10;i++)
        {
            double eachPercent= ((double)count[i]/base)*100;
            System.out.println(i+": "+eachPercent+"%"+",");
        }
    }
}

運行結果:

0: 10.0005311%,
1: 10.0011356%,
2: 10.000164%,
3: 9.9996706%,
4: 9.999522800000001%,
5: 10.0005772%,
6: 10.0003636%,
7: 9.99965%,
8: 9.9987534%,
9: 9.9996317%,


可以看到這10個數生成的概率基本都是一致的,每個佔10%。

使用Random類生成從n到m的隨機整數:

import java.util.Random;
public class RandomTest
{
    public static void main(String[] args)
    {
        int max = 20;
        int min = 10;
        Random random = new Random();
 
        int s = random.nextInt(max) % (max - min + 1) + min;
        System.out.println(s);
    }
}

random.nextInt(m)表示生成[0,m-1]之間的隨機數,也就是說random.nextInt(m+1),將生成[0,m]之間的隨機整數。

測試每個生成的隨機數概率

import java.util.Random;
public class RandomTest
{
    public static void main(String[] args)
    {
        int min = 0;
        int max = 9;
        Random random = new Random();
        //random.nextInt(max+1)表示生成[0,max]之間的隨機數
        int[] count=new int[10];
        int base=10000000;
        int b;
        for(int i=0;i<base;i++)
        { 
            //生成[0,9]
//            b=(int)(Math.random()*10);
//                      random.nextInt(max+1-min) 生成[0,max-min]之間的隨機整數,再加上min 即[min,max]
                        b=min+random.nextInt(max+1-min);
            if(b<0)
                break;
            if (b>9)
            {
                break;
            }
            switch (b)
            {
                case 0:
                    count[0]++;
                    break;
                case 1:
                    count[1]++;
                    break;
                case 2:
                    count[2]++;
                    break;
                case 3:
                    count[3]++;
                    break;
                case 4:
                    count[4]++;
                    break;
                case 5:
                    count[5]++;
                    break;
                case 6:
                    count[6]++;
                    break;
                case 7:
                    count[7]++;
                    break;
                case 8:
                    count[8]++;
                    break;
                case 9:
                    count[9]++;
                    break;
            }
//            System.out.println(b);
        }
        for(int i=0;i<10;i++)
        {
            double eachPercent= ((double)count[i]/base)*100;
            System.out.println(i+": "+eachPercent+"%"+",");
        }
    }
}


結果:

0: 10.01158%,
1: 9.99082%,
2: 10.0109%,
3: 10.00464%,
4: 9.99602%,
5: 9.991990000000001%,
6: 9.995560000000001%,
7: 9.998990000000001%,
8: 9.98683%,
9: 10.01267%,

可以看到生成的[m,n]之間的隨機整數的方法:先生成[0,n-m]的隨機整數,然後再加上m,即可得到[m,n]之間的隨機整數。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章