int
특정 범위에서 임의의 값을 생성하려면 어떻게합니까 ?
다음을 시도했지만 작동하지 않습니다.
시도 1 :
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
시도 2 :
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.
답변
에서 나중에 자바 1.7 다음과 같이이 작업을 수행하는 표준 방법입니다 :
import java.util.concurrent.ThreadLocalRandom;
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);
관련 JavaDoc을 참조하십시오 . 이 접근법은 java.util.Random 인스턴스 를 명시 적으로 초기화 할 필요가 없다는 장점이 있는데, 부적절하게 사용하면 혼란과 오류의 원인이 될 수 있습니다.
그러나 반대로 시드를 명시 적으로 설정하는 방법은 없으므로 게임 상태를 테스트하거나 저장하는 등의 유용한 상황에서 결과를 재현하기 어려울 수 있습니다. 이러한 상황에서는 아래에 표시된 Java 1.7 이전 기술을 사용할 수 있습니다.
Java 1.7 이전 의 표준 방법은 다음과 같습니다.
import java.util.Random;
/**
* Returns a pseudo-random number between min and max, inclusive.
* The difference between min and max can be at most
* <code>Integer.MAX_VALUE - 1</code>.
*
* @param min Minimum value
* @param max Maximum value. Must be greater than min.
* @return Integer between min and max, inclusive.
* @see java.util.Random#nextInt(int)
*/
public static int randInt(int min, int max) {
// NOTE: This will (intentionally) not run as written so that folks
// copy-pasting have to think about how to initialize their
// Random instance. Initialization of the Random instance is outside
// the main scope of the question, but some decent options are to have
// a field that is initialized once and then re-used as needed or to
// use ThreadLocalRandom (if using at least Java 1.7).
//
// In particular, do NOT do 'Random rand = new Random()' here or you
// will get not very good / not very random results.
Random rand;
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
관련 JavaDoc을 참조하십시오 . 실제로 java.util.Random 클래스는 종종 java.lang.Math.random () 보다 선호됩니다 .
특히 작업을 수행하기 위해 표준 라이브러리 내에 간단한 API가있는 경우 임의 정수 생성 휠을 재발 명할 필요가 없습니다.
답변
이 방법은 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))
답변
사용하다:
Random ran = new Random();
int x = ran.nextInt(6) + 5;
정수 x
는 이제 가능한 결과가있는 난수입니다 5-10
.
답변
사용하다:
minimum + rn.nextInt(maxValue - minvalue + 1)
답변
와 자바 -8그들은 수업 ints(int randomNumberOrigin, int randomNumberBound)
에서 그 방법을 소개했습니다 Random
.
예를 들어 [0, 10] 범위에서 5 개의 임의 정수 (또는 단일 정수)를 생성하려면 다음을 수행하십시오.
Random r = new Random();
int[] fiveRandomNumbers = r.ints(5, 0, 11).toArray();
int randomNumber = r.ints(1, 0, 11).findFirst().getAsInt();
첫 번째 매개 변수는 IntStream
생성 된 크기 (무제한을 생성하는 메소드의 오버로드 된 메소드)의 크기 만 나타냅니다 IntStream
.
여러 개의 개별 호출을 수행해야하는 경우 스트림에서 무한 기본 반복자를 만들 수 있습니다.
public final class IntRandomNumberGenerator {
private PrimitiveIterator.OfInt randomIterator;
/**
* Initialize a new random number generator that generates
* random numbers in the range [min, max]
* @param min - the min value (inclusive)
* @param max - the max value (inclusive)
*/
public IntRandomNumberGenerator(int min, int max) {
randomIterator = new Random().ints(min, max + 1).iterator();
}
/**
* Returns a random number in the range (min, max)
* @return a random number in the range (min, max)
*/
public int nextInt() {
return randomIterator.nextInt();
}
}
값 double
과 long
값으로 도 할 수 있습니다 . 도움이 되길 바랍니다! 🙂
답변
두 번째 코드 예제를 편집하여 다음을 수행 할 수 있습니다.
Random rn = new Random();
int range = maximum - minimum + 1;
int randomNum = rn.nextInt(range) + minimum;
답변
첫 번째 솔루션을 약간만 수정하면 충분합니다.
Random rand = new Random();
randomNum = minimum + rand.nextInt((maximum - minimum) + 1);
구현에 대한 자세한 내용은 여기를 참조하십시오 Random