[java] Java의 특정 범위 내에서 임의의 정수를 어떻게 생성합니까?

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)


답변

그들은 수업 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();
    }
}

doublelong값으로 도 할 수 있습니다 . 도움이 되길 바랍니다! 🙂


답변

두 번째 코드 예제를 편집하여 다음을 수행 할 수 있습니다.

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