이 방법은 https://stackoverflow.com/a/738651/360211nextInt
방법 보다 편향되어 비효율적입니다.
이를 달성하기위한 하나의 표준 패턴은 다음과 같습니다.
Min + (int)(Math.random() * ((Max - Min) + 1))
자바 수학 라이브러리 함수 인 Math.random ()는 범위의 두 값을 생성한다 [0,1)
. 이 범위에는 1이 포함되지 않습니다.
특정 범위의 값을 먼저 얻으려면 적용 할 값 범위의 크기를 곱해야합니다.
Math.random() * ( Max - Min )
[0,Max-Min)
'Max-Min'이 포함되지 않은 범위의 값을 반환합니다 .
예를 들어 원하는 경우 [5,10)
5 개의 정수 값을 포함해야합니다.
Math.random() * 5
[0,5)
5 범위 에 포함되지 않은 범위의 값을 반환합니다 .
이제이 범위를 타겟팅하는 범위로 이동해야합니다. 최소값을 추가하면됩니다.
Min + (Math.random() * (Max - Min))
이제 범위 내의 값을 얻게됩니다 [Min,Max)
. 우리의 예에 따르면, 그것은 다음을 의미합니다 [5,10)
.
5 + (Math.random() * (10 - 5))
그러나 이것은 여전히 포함 Max
되어 있지 않으며 두 배의 가치를 얻고 있습니다. Max
포함 된 값 을 얻으 려면 range 매개 변수에 1을 추가 (Max - Min)
한 다음 int로 캐스팅하여 소수 부분을 잘라야합니다. 이것은 다음을 통해 달성됩니다.
Min + (int)(Math.random() * ((Max - Min) + 1))
그리고 거기 있습니다. 범위 [Min,Max]
또는 예 에 따른 임의의 정수 값 [5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))