JAva Math.random()nからmまでのランダム整数を生成

3774 ワード

JavaのMathクラスのrandom()メソッドでは、[0,1]間のランダム浮動小数点数を生成できます.doubleタイプのデータはintタイプに強制的に変換され、整数部分はintタイプの変数に割り当てられ、小数点以降の小数部分は失われます.
[0,n]のランダム整数を生成する場合は、Math.random()にn+1を乗じて[0,n+1]の浮動小数点数を生成し、強制型をint型に変換し、その整数部分だけを取るだけで[0,n]の整数を得ることができます.
int b=(int)(Math.random()*10);//  [0,9]       。
int temp=m+(int)(Math.random()*(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;i9)
            {
                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;i9)
			{
				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]間のランダム整数が得られる.