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


3501

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`.

많은 난수가 필요할 때 API에서 Random 클래스를 권장하지 않습니다. 기간이 너무 짧습니다. 메르 센 트위스터를 대신 사용해보십시오 . 이 자바 구현 .
raupach

1
새 답변을 게시하기 전에이 질문에 대한 답변이 이미 65 개 이상인 것을 고려하십시오. 귀하의 답변이 기존 답변에 속하지 않은 정보를 제공하는지 확인하십시오.
janniks

답변:


3797

에서 나중에 자바 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가있는 경우 임의 정수 생성 휠을 재발 명할 필요가 없습니다.


43
max값이 있는 호출의 경우 Integer.MAX_VALUE으로 오버플로 될 수 java.lang.IllegalArgumentException있습니다. 당신은 시도 할 수 있습니다 : randInt(0, Integer.MAX_VALUE). 또한 nextInt((max-min) + 1)가장 높은 값을 반환하면 (아마도 희귀하다고 가정합니다) 다시 오버플로되지 않습니다 (최소 및 최대 값이 충분하다고 가정)? 이런 상황에 대처하는 방법?
Daniel

3
@MoisheLipsker nextLong은 nextInteger로 바인딩되지 않습니다
mmm

13
@leventov ThreadLocalRandom는이 질문을받은 후 2 년 반 만에 Java에 추가되었습니다. 나는 항상 랜덤 인스턴스 관리가 문제의 범위를 벗어났다는 확고한 견해를 가지고있었습니다.
Greg Case

6
안드로이드에서 무작위 rand = new Random ();
Webserveis가

5
@Webserveis 예제의 주석에서 설명합니다. 짧은 버전-함수를 호출 할 때마다 = new Random ()해서는 안됩니다. 그렇지 않으면 많은 경우 결과가 충분히 임의적이지 않습니다.
Greg Case

1421

이 방법은 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))

82
Sun 문서에는 명시 적으로 double을 생성하는 Math.random () 대신 int가 필요한 경우 Random ()을 사용하는 것이 좋습니다.
릴리안 A. 모라 루

6
이것은 실제로 nextInt 메소드와 비교하여 바이어스됩니다. stackoverflow.com/a/738651/360211
weston

4
이 경우 "바이어스 드 (biased)"는 2 ^ 53의 실행 후 일부 숫자가 평균적으로 하나의 추가 점유율을 가졌음을 의미합니다.
Cephalopod

378

사용하다:

Random ran = new Random();
int x = ran.nextInt(6) + 5;

정수 x는 이제 가능한 결과가있는 난수입니다 5-10.



137

그들은 수업 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값으로 도 할 수 있습니다 . 도움이 되길 바랍니다! :)


1
randomIterator를 한 번만 인스턴스화하는 것이 좋습니다. 자신의 답변에 대한 Greg Case 의견을 참조하십시오.
Naxos84

가능하다면, streamSize이 방법의 첫 번째 매개 변수 인 의의가 무엇인지 설명 할 수 있습니까 streamSize !=0? streamSize1 / 2 / n을 주면 차이점은 무엇입니까 ?
Erfan Ahmed

104

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

Random rn = new Random();
int range = maximum - minimum + 1;
int randomNum =  rn.nextInt(range) + minimum;

99

첫 번째 솔루션을 약간만 수정하면 충분합니다.

Random rand = new Random();
randomNum = minimum + rand.nextInt((maximum - minimum) + 1);

구현에 대한 자세한 내용은 여기를 참조하십시오 Random


최소 <= 값 <최대의 경우 Math와 동일하게 수행했습니다. randomNum = minimum + (int) (Math.random () * (maximum-minimum)); 그러나 캐스팅은보기에 정말 좋지 않습니다.)
AxelH

최소 7 년 늦게 중복 된 답변.
Maarten Bodewes

70

ThreadLocalRandomjava.util.Random다중 스레드 환경 의 클래스와 동일 합니다. 난수 생성은 각 스레드에서 로컬로 수행됩니다. 따라서 충돌을 줄임으로써 성능이 향상됩니다.

int rand = ThreadLocalRandom.current().nextInt(x,y);

x, y- 간격 예를 들어, (1,10)


66

JavaMath.Random클래스 는 0 기반입니다. 따라서 다음과 같이 작성하면

Random rand = new Random();
int x = rand.nextInt(10);

x0-9포함 사이에 있습니다 .

따라서 다음과 같은 25항목 배열이 주어지면 (배열의 0기준) 사이에 난수를 생성하는 코드 는 다음과 같습니다 array.length.

String[] i = new String[25];
Random rand = new Random();
int index = 0;

index = rand.nextInt( i.length );

이후 i.length리턴 25상기는 nextInt( i.length )의 범위 사이의 수를 반환한다 0-24. 다른 옵션은 Math.Random동일한 방식으로 작동합니다.

index = (int) Math.floor(Math.random() * i.length);

더 잘 이해하려면 포럼 게시물 Random Intervals (archive.org)를 확인하십시오 .


wayBackMachine 아카이브 스크린 샷 링크에 대한 +1 및 귀하의 답변은 범위 내에서 "랜덤"정수를 얻는 데 여전히 유용한 참조 자료입니다.
Tapper7

인덱스를 0으로 인스턴스화하는 이유가 무엇입니까?
AjahnCharles

@CodeConfident index변수는 난수 결과에 영향을 미치지 않습니다. 결과 변경에 대해 걱정할 필요없이 원하는 방식으로 초기화하도록 선택할 수 있습니다. 도움이 되었기를 바랍니다.
Matt R

정확히 ... 완전히 사용되지 않습니다. 나는 그것을 랜드로 직접 초기화 할 것입니다 :int index = rand.nextInt(i.Length);
AjahnCharles

아니면 전혀. int index; \n index = rand...다른 줄에서 선언과 할당을 좋아한다면. 일부 코딩 표준은 다른 표준보다 더 엄격합니다 (명백한 목적이 없음).
Mark Storer

49

까다로워서 용서해주십시오. 그러나 대다수가 제안한 해결책은 다음 min + rng.nextInt(max - min + 1))과 같은 사실 때문에 위험 해 보입니다.

  • rng.nextInt(n)에 도달 할 수 없습니다 Integer.MAX_VALUE.
  • (max - min)min음수 일 때 오버플로가 발생할 수 있습니다 .

완벽한 솔루션은 min <= max[ Integer.MIN_VALUE, Integer.MAX_VALUE] 내에서 올바른 결과를 반환합니다 . 다음 순진한 구현을 고려하십시오.

int nextIntInRange(int min, int max, Random rng) {
   if (min > max) {
      throw new IllegalArgumentException("Cannot draw random int from invalid range [" + min + ", " + max + "].");
   }
   int diff = max - min;
   if (diff >= 0 && diff != Integer.MAX_VALUE) {
      return (min + rng.nextInt(diff + 1));
   }
   int i;
   do {
      i = rng.nextInt();
   } while (i < min || i > max);
   return i;
}

비효율적이지만 while루프 에서 성공할 확률 은 항상 50 % 이상입니다.


차이 = Integer.MAX_VALUE 인 경우 IllegalArgumentException을 발생시키지 않는 이유는 무엇입니까? 그런 다음 while 루프가 필요하지 않습니다.
MP Korstanje

3
@mpkorstanje이 구현은 차이가 MAX_VALUE 이상인 경우에도 min <= max의 값으로 작동하도록 설계되었습니다. 이 경우 성공의 공통 패턴이 될 때까지 루프를 실행하여 균일 한 분포를 보장합니다 (기본 랜덤 소스가 균일 한 경우). Random.nextInt (int)는 인수가 2의 제곱이 아닌 경우 내부적으로 수행합니다.
Christian Semrau

44

간단히 진술을 수행하면됩니다.

Randomizer.generate(0,10); //min of zero, max of ten

아래는 소스 코드입니다

Randomizer.java

public class Randomizer {
    public static int generate(int min,int max) {
        return min + (int)(Math.random() * ((max - min) + 1));
    }
}

깨끗하고 간단합니다.


5
이것은 다른 예의 편집일 수 있었지만 이제는 평판을위한 끔찍한 사본 일뿐입니다. "투표가 가장 많은 답변"을 지적하는 것도 그리 직접적이지 않으므로 변경할 수 있습니다.
Maarten Bodewes 2016 년

1
바로 @MaartenBodewes입니다. 이 답변을 쓸 때 위의 표를 많이받은 답변 은 여전히 ​​알고리즘과 같은 솔루션으로 작성되었습니다. 이제 위의 솔루션이 많이 바뀌었고 이제이 답변은 모방 고양이처럼 보였습니다.
Abel Callejo 2016 년

왜 그런 기본 코드가 Java 표준 라이브러리의 일부가 아닌지 알 수 없습니다. 왜 이것을 구현해야합니까?
Leevi L


31

예를 들어 보자.

5-10 사이의 숫자를 생성한다고 가정합니다 .

int max = 10;
int min = 5;
int diff = max - min;
Random rn = new Random();
int i = rn.nextInt(diff + 1);
i += min;
System.out.print("The Random Number is " + i);

우리가 이것을 이해하자 ...

최대 값으로 최대 값을 초기화하고 최소값으로 최소값을 초기화하십시오.

이제 얻을 수있는 값의 수를 결정해야합니다. 이 예에서는 다음과 같습니다.

5, 6, 7, 8, 9, 10

따라서이 수는 최대-최소 + 1입니다.

즉 10-5 + 1 = 6

난수는 0-5 사이의 숫자를 생성합니다 .

즉, 0, 1, 2, 3, 4, 5

임의의 숫자에 최소값을 추가하면 다음 이 생성됩니다.

5, 6, 7, 8, 9, 10

따라서 원하는 범위를 얻습니다.



26

nextint (n) 메소드 를 사용하여 min과 max의 차이에 대한 난수를 생성 한 다음 결과에 최소 숫자를 추가하십시오.

Random rn = new Random();
int result = rn.nextInt(max - min + 1) + min;
System.out.println(result);

26

나는 이것을 사용한다 :

 /**
   * @param min - The minimum.
   * @param max - The maximum.
   * @return A random double between these numbers (inclusive the minimum and maximum).
   */
 public static double getRandom(double min, double max) {
   return (Math.random() * (max + 1 - min)) + min;
 }

원하는 경우 정수로 캐스트 할 수 있습니다.


이 함수는 동일한 숫자를 반복해서 생성합니다. 내 경우에는 : 2147483647
sokras

실패 : 이중이 필요한 기능이 있고 + 1을 수행합니까? 이것은 확실히 가장 놀람의 원칙에 위배됩니다. 최소 = 0.1 및 최대 = 0.2를 사용하면 어떻게됩니까?
Maarten Bodewes

@sokras 메소드 호출 new Random(JavaDoc 확인) : "새로운 난수 생성기를 작성합니다.이 생성자는 난수 생성기의 시드를이 생성자의 다른 호출과 구별 될 수있는 값으로 설정합니다." 현재 시간을 시드로 사용하는 것과 관련이있을 수 있습니다. 해당 시간이 밀리 초를 사용하는 경우 현재 컴퓨터는 동일한 수를 생성 할만큼 빠릅니다. 그러나 그 외에 2147483647은 Integer.MAX_VALUE; 출력은 분명히 입력하지 않은 입력에 따라 다릅니다.
Maarten Bodewes

실제로 실제로 작동하는 것을 발견했습니다
Jency

23

Java 7부터는 더 이상 사용하지 않아야합니다 Random. 대부분의 경우 임의의 숫자 생성기가 선택됩니다 ThreadLocalRandom.

포크 조인 풀 및 병렬 스트림의 경우을 사용하십시오 SplittableRandom.

조슈아 블로흐. 효과적인 자바. 세번째 판.

Java 8에서 시작

포크 조인 풀 및 병렬 스트림의 경우 SplittableRandom일반적으로 사용 하는 것이 더 빠르며 통계적 독립성 및 균일 성 특성이보다 빠릅니다 Random.

int범위에서 랜덤을 생성하려면[0, 1_000]:

int n = new SplittableRandom().nextInt(0, 1_001);

int[100]범위 내에서 임의 의 값 배열 을 생성하려면[0, 1_000]:

int[] a = new SplittableRandom().ints(100, 0, 1_001).parallel().toArray();

임의의 값의 스트림을 반환하려면

IntStream stream = new SplittableRandom().ints(100, 0, 1_001);

예제에 왜 포함되어 .parallel()있습니까? 100 난수를 생성하는 것이 병렬 처리를 보증하기에는 너무 사소한 것처럼 보입니다.
Johnbot

@Johnbot 의견을 주셔서 감사합니다, 당신이 맞아요. 그러나 주된 이유는 API를 보여주는 것이 었습니다 (물론 스마트 경로는 parallel처리 를 사용하기 전에 성능을 측정 하는 것입니다). 그건 그렇고, 1_000_000요소 배열의 경우 parallel순차적 버전과 비교할 때 내 컴퓨터 의 버전이 2 배 빠릅니다.
Oleksandr Pyrohov

21

Random 클래스를 사용하십시오 .

Random ran = new Random();
// Assumes max and min are non-negative.
int randomInt = min + ran.nextInt(max - min + 1);

8
수많은 이전 게시물에 게시되지 않은 새로운 내용이 없습니다.
Maarten Bodewes 2016 년

20

이 방법은 사용하기 편리 할 수 ​​있습니다.

이 메소드는 제공된 최소값과 최대 값 사이 의 난수를 리턴 합니다.

public static int getRandomNumberBetween(int min, int max) {
    Random foo = new Random();
    int randomNumber = foo.nextInt(max - min) + min;
    if (randomNumber == min) {
        // Since the random number is between the min and max values, simply add 1
        return min + 1;
    } else {
        return randomNumber;
    }
}

이 메소드는 제공된 최소값 및 최대 값 에서 난수를 리턴 합니다 (따라서 생성 된 숫자는 최소 또는 최대 값일 수 있음).

public static int getRandomNumberFrom(int min, int max) {
    Random foo = new Random();
    int randomNumber = foo.nextInt((max + 1) - min) + min;

    return randomNumber;
}

// Since the random number is between the min and max values, simply add 1. 왜? 최소 카운트하지 않습니까? 일반적으로 범위는 [min, max)이며 min이 포함되고 max가 제외됩니다. 답이 잘못되었습니다.
Maarten Bodewes

getRandomNumberBetween이 제공된 엔드 포인트를 제외한 난수를 생성하므로 @MaartenBodewes +1이 추가됩니다.
Luke Taylor

1
숫자 min + 1는 다른 숫자보다 두 배나 더 높습니다 getRandomNumberBetween!
Lii

19

주사위를 굴릴 경우 1에서 6 사이의 난수 (0에서 6이 아님)가됩니다.

face = 1 + randomNumbers.nextInt(6);

19
int random = minimum + Double.valueOf(Math.random()*(maximum-minimum )).intValue();

또는 Apache Commons의 RandomUtils를 살펴보십시오 .


유용하지만 작은 결함에주의하십시오. 메소드 서명은 nextDouble (double startInclusive, double endInclusive)와 비슷하지만 메소드 내부를 살펴보면 endInclusive는 실제로 endExclusive 여야합니다.
zakmck

Double.valueOf(Math.random()*(maximum-minimun)).intValue()말할 수있는 난독 화 된 (그리고 비효율적 인) 방법입니다 (int)(Math.random()*(maximum-minimun))
Holger

최소 반환 최소 + 맞춤법 불일치 + Double.valueOf (Math.random () * (최대-최소)). intValue ();
Hrishikesh Mishra

18

다음 ints은 포괄적 / 독점 범위의 조합으로 범위에서 무작위를 생성하는 유용한 클래스입니다 .

import java.util.Random;

public class RandomRange extends Random {
    public int nextIncInc(int min, int max) {
        return nextInt(max - min + 1) + min;
    }

    public int nextExcInc(int min, int max) {
        return nextInt(max - min) + 1 + min;
    }

    public int nextExcExc(int min, int max) {
        return nextInt(max - min - 1) + 1 + min;
    }

    public int nextIncExc(int min, int max) {
        return nextInt(max - min) + min;
    }
}

18

"두 숫자 사이에"난수를 생성하려면 다음 코드를 사용하십시오.

Random r = new Random();
int lowerBound = 1;
int upperBound = 11;
int result = r.nextInt(upperBound-lowerBound) + lowerBound;

이것은 1 (포함)과 11 (제외) 사이의 난수를 제공하므로 1을 추가하여 upperBound 값을 초기화하십시오. 예를 들어, 1 ~ 10 사이의 난수를 생성하려면 대신에 10.


18

Java 8에서 간결하게 달성 할 수 있습니다.

Random random = new Random();

int max = 10;
int min = 5;
int totalNumber = 10;

IntStream stream = random.ints(totalNumber, min, max);
stream.forEach(System.out::println);

17
public static Random RANDOM = new Random(System.nanoTime());

public static final float random(final float pMin, final float pMax) {
    return pMin + RANDOM.nextFloat() * (pMax - pMin);
}

16

또 다른 옵션은 Apache Commons를 사용하는 것입니다 .

import org.apache.commons.math.random.RandomData;
import org.apache.commons.math.random.RandomDataImpl;

public void method() {
    RandomData randomData = new RandomDataImpl();
    int number = randomData.nextInt(5, 10);
    // ...
 }

16

이 예제에서 난수 생성을 발견했습니다 .


이 예제는 특정 범위에서 임의의 정수를 생성합니다.

import java.util.Random;

/** Generate random integers in a certain range. */
public final class RandomRange {

  public static final void main(String... aArgs){
    log("Generating random integers in the range 1..10.");

    int START = 1;
    int END = 10;
    Random random = new Random();
    for (int idx = 1; idx <= 10; ++idx){
      showRandomInteger(START, END, random);
    }

    log("Done.");
  }

  private static void showRandomInteger(int aStart, int aEnd, Random aRandom){
    if ( aStart > aEnd ) {
      throw new IllegalArgumentException("Start cannot exceed End.");
    }
    //get the range, casting to long to avoid overflow problems
    long range = (long)aEnd - (long)aStart + 1;
    // compute a fraction of the range, 0 <= frac < range
    long fraction = (long)(range * aRandom.nextDouble());
    int randomNumber =  (int)(fraction + aStart);    
    log("Generated : " + randomNumber);
  }

  private static void log(String aMessage){
    System.out.println(aMessage);
  }
} 

이 클래스의 예제 실행 :

Generating random integers in the range 1..10.
Generated : 9
Generated : 3
Generated : 3
Generated : 9
Generated : 4
Generated : 1
Generated : 3
Generated : 9
Generated : 10
Generated : 10
Done.

14

무작위보다는 SecureRandom 을 사용하는 것이 좋습니다.

public static int generateRandomInteger(int min, int max) {
    SecureRandom rand = new SecureRandom();
    rand.setSeed(new Date().getTime());
    int randomNum = rand.nextInt((max - min) + 1) + min;
    return randomNum;
}

1
동일한 밀리 초 내에 실행되면 같은 수를 얻게되므로 랜드 초기화와 setSeet를 메소드 외부에 넣어야하기 때문에 이것은 좋지 않습니다.
maraca

시드가 필요하지만 SecureRandom을 사용하십시오.
grep

죄송하지만 변경 요청을 거부 한 사람은 Java 프로그래밍에 대한 단서가 없습니다 . 좋은 제안이지만 , 같은 밀리 초 내에 실행하면 무작위가 아닌 동일한 숫자를 제공하기 때문에 잘못된 것입니다.
maraca

올바른 해결책을 찾을 수있는 곳은 없으며, 많은 사람들이 정적 이니셜 라이저 블록을 알지 못합니다. 이것이 시드를 설정하는 데 사용해야하는 것입니다 : 1 : private static int SecureRandom rand = new SecureRandom();2 : static {3 : rand.setSeed(...);4 :}
maraca

5
시드 할 필요는 전혀 없으며 SecureRandom시스템에 의해 시드됩니다. 직접 전화하는 setSeed것은 매우 위험하므로 (임의의) 시드를 날짜로 바꿀 수 있습니다. 누구나 시간을 추측하고 해당 정보를 사용 하여 자신의 인스턴스를 시도하고 시드 할 수 있기 때문에 확실히 그 결과는 아닙니다 . SecureRandomSecureRandom
Maarten Bodewes

13

닫힌 [min, max]범위 에서 난수를 생성하는 방법을 보여주는 간단한 샘플은 다음과 같습니다.min <= max is true

홀 클래스에서 필드로 재사용 할 수 있으며 모든 Random.class방법을 한 곳에 배치 할 수도 있습니다

결과 예 :

RandomUtils random = new RandomUtils();
random.nextInt(0, 0); // returns 0
random.nextInt(10, 10); // returns 10
random.nextInt(-10, 10); // returns numbers from -10 to 10 (-10, -9....9, 10)
random.nextInt(10, -10); // throws assert

출처 :

import junit.framework.Assert;
import java.util.Random;

public class RandomUtils extends Random {

    /**
     * @param min generated value. Can't be > then max
     * @param max generated value
     * @return values in closed range [min, max].
     */
    public int nextInt(int min, int max) {
        Assert.assertFalse("min can't be > then max; values:[" + min + ", " + max + "]", min > max);
        if (min == max) {
            return max;
        }

        return nextInt(max - min + 1) + min;
    }
}

13
rand.nextInt((max+1) - min) + min;

이것은 잘 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.