JAVA의 Random 클래스 사용법 상세 정보

5743 단어 JAVARandom
Random 클래스(java.util)
Random류에서 실현된 랜덤 알고리즘은 위조 랜덤, 즉 규칙이 있는 랜덤이다.랜덤을 진행할 때 랜덤 알고리즘의 기원 숫자를 씨앗수(seed)라고 하는데 씨앗수를 바탕으로 일정한 변환을 하여 필요한 랜덤 숫자를 생성한다.
같은 피드 수의 Random 객체는 같은 횟수로 생성된 무작위 숫자와 동일합니다.즉, 두 개의 씨앗 수가 같은 랜덤 대상은 처음 생성된 랜덤 숫자가 완전히 같고, 두 번째 생성된 랜덤 숫자도 완전히 같다는 것이다.이 점은 여러 개의 무작위 숫자를 생성할 때 특히 주의해야 한다.
다음은 랜덤 클래스의 사용과 지정된 구간의 무작위 그룹을 어떻게 생성하고 프로그램에서 요구하는 확률을 실현하는지 소개한다.
1. Random 객체 생성
Random 클래스에는 다음과 같은 두 가지 구조 방법이 있습니다.
a、public Random()
이 구조 방법은 현재 시스템 시간에 대응하는 상대적인 시간과 관련된 숫자를 피드 수로 사용하고 이 피드 수로 Random 대상을 구성합니다.
b、public Random(long seed)
이 구조 방법은 하나의 씨앗 수를 만들어서 만들 수 있다.
예제 코드:

Random r = new Random();
Random r1 = new Random(10);
다시 한 번 강조하지만 피드 수는 랜덤 알고리즘의 기원 숫자일 뿐 생성된 랜덤 숫자의 구간과 무관하다.
2. Random 클래스에서 자주 사용하는 방법
Random 클래스의 방법은 비교적 간단하고 모든 방법의 기능도 이해하기 쉽다.설명해야 할 것은random류에서 각 방법으로 생성된 무작위 숫자는 모두 고르게 분포되어 있다는 것이다. 즉, 구간 내부의 숫자가 생성될 확률이 균등하다는 것이다.다음은 이러한 방법에 대해 기본적인 소개를 하겠습니다.
a、public boolean nextBoolean()
이 방법의 작용은 무작위적인boolean값을 생성하고true와false값을 생성하는 확률이 같다. 즉, 모두 50%의 확률이다.
b、public double nextDouble()
이 방법의 작용은 무작위 더블 값을 생성하는 것이다. 수치는 [0,1.0) 사이에 있다.
c、public int nextInt()
이 방법의 역할은 무작위 int 값을 생성하는 것이다. 이 값은 int의 구간, 즉 -231에서 231-1 사이에 있다.
만약 지정된 구간의 int 값을 생성해야 한다면 일정한 수학 변환을 해야 한다. 구체적으로는 아래의 사용 예시의 코드를 참고할 수 있다.
d、public int nextInt(int n)
이 방법의 역할은 랜덤 int 값을 생성하는 것이다. 이 값은 [0, n)의 구간, 즉 0에서 n 사이의 랜덤 int 값을 포함하고 n을 포함하지 않는다.
지정된 구간의 int 값을 생성하려면 일정한 수학 변환이 필요합니다. 구체적으로는 아래의 사용 예시의 코드를 참고할 수 있습니다.
e、public void setSeed(long seed)
이 메서드의 역할은 Random 객체의 시드 수를 재설정하는 것입니다.피드 수를 설정한 후의 Random 객체와 같은 피드 수는 new 키워드를 사용하여 생성된 Random 객체와 같습니다.
3. Random 클래스 사용 예
Random 클래스를 사용하면 일반적으로 지정된 구간의 랜덤 숫자를 생성하는데 다음은 대응하는 구간의 랜덤 숫자를 어떻게 생성하는지 소개한다.다음 랜덤 수를 생성하는 코드는 다음 Random 객체 r를 사용하여 생성됩니다.
Random r = new Random();
a, 생성 [0,1.0) 구간의 소수

double d1 = r.nextDouble();
넥스트 더블 방법으로 직접 얻을 수 있습니다.
b, 생성 [0,5.0) 구간의 소수

double d2 = r.nextDouble() * 5;
넥스트 더블 방법으로 생성된 디지털 구간은 [0,1.0)이기 때문에 이 구간을 5배 확대하는 것이 요구되는 구간이다.
같은 이치로 [0,d) 구간의 무작위 소수를 생성하고 d는 임의의 양의 소수로 하면nextDouble 방법의 반환값을 d로 곱하면 된다.
c, 생성[1,2.5) 구간의 소수

double d3 = r.nextDouble() * 1.5 + 1;
[1,2.5) 구간의 무작위 소수를 생성하려면 먼저 [0,1.5) 구간의 무작위 숫자를 생성한 다음에 생성된 무작위 소수 구간을 1을 더하면 된다.
같은 이치로 0에서 시작하지 않는 소수 구간 [d1, d2) 범위의 무작위 숫자(그중 d1은 0이 아니다)를 생성하려면 먼저 [0, d2-d1) 구간의 무작위 숫자를 생성한 다음에 생성된 무작위 숫자 구간에 d1을 더하면 된다.
d, 임의의 정수 생성

int n1 = r.nextInt();
nextInt 방법을 직접 사용하면 됩니다.
e, 생성 [0,10) 구간의 정수

int n2 = r.nextInt(10);
n2 = Math.abs(r.nextInt() % 10);
상기 두 줄 코드는 모두 [0,10) 구간의 정수를 생성할 수 있다.
첫 번째는 Random 클래스의 nextInt(intn) 방법을 사용하여 직접 실현한다.
두 번째 실현에서 먼저nextInt() 방법을 호출하여 임의의 int 숫자를 생성한다. 이 숫자와 10을 추출한 후에 생성된 숫자 구간은 (-10,10)이고 그 구간에 대해 절대값을 구하면 얻어지는 구간은 [0,10)이다.
같은 방법으로 임의의 [0,n) 구간의 무작위 정수를 생성하면 다음과 같은 코드를 사용할 수 있다.

int n2 = r.nextInt(n);
n2 = Math.abs(r.nextInt() % n);
f, 생성 [0,10] 구간의 정수

int n3 = r.nextInt(11);
n3 = Math.abs(r.nextInt() % 11);
정수 구간에 비해 [0,10]구간과 [0,11)구간은 등가이기 때문에 [0,11)구간의 정수를 생성한다.
g, 생성[-3,15)구간의 정수

int n4 = r.nextInt(18) - 3;
n4 = Math.abs(r.nextInt() % 18) - 3;
0에서 시작하지 않는 구간의 무작위 정수를 생성하면 위에서 0에서 시작하지 않는 소수 구간의 실현 원리에 대한 설명을 참고할 수 있다.
h, 확률 실현
일정한 확률에 따라 프로그램 논리를 실현하는 것도 무작위 처리로 해결할 수 있는 문제다.다음은 간단한 예시로 무작위 숫자를 사용하여 확률을 실현하는 논리를 보여 준다.
앞의 방법 소개에서 넥스트 인트(intn) 방법에서 생성된 숫자는 고르다. 즉, 이 구간 내부의 모든 숫자가 생성될 확률이 같다는 것이다.그렇다면 [0100)구간의 무작위 정수를 생성하면 숫자마다 생성될 확률이 같아야 하며, 이 구간에는 총 100개의 정수가 있기 때문에 숫자마다 1%의 확률이 있다. 이 이론에 따르면 프로그램의 확률 문제를 실현할 수 있다.
예: 무작위로 하나의 정수를 생성하는데 이 정수는 55%의 확률로 1을 생성하고 40%의 확률로 2를 생성하며 5%의 확률로 3을 생성한다.구현된 코드는 다음과 같습니다.

int n5 = r.nextInt(100);
int m; //
if(n5 < 55){ //55 ,55%
    m = 1;
}else if(n5 < 95){//[55,95),40 ,40%
    m = 2;
}else{
    m = 3;
}
모든 숫자의 확률이 1%이기 때문에 임의의 55개 숫자의 구간의 확률은 55%이다. 코드를 쉽게 쓰기 위해 [0,55) 구간의 모든 정수를 사용하는데 후속적인 원리와 같다.
물론 이곳의 코드는 간소화할 수 있다. 확률은 모두 5%의 배수이기 때문에 5%를 바탕으로 확률을 제어하면 된다. 다음은 간소화된 코드가 실현된다.

int n6 = r.nextInt(20);
int m1;
if(n6 < 11){
    m1 = 1;
}else if(n6 < 19){
    m1 = 2;
}else{
    m1 = 3;
}
프로그램 내부에서 확률의 논리는 위의 설명에 따라 실현될 수 있다.
4. 기타 질문
a, 동일한 피드 수 Random 객체 문제
앞에서 소개한 바와 같이 같은 피드 수의 랜덤 대상은 같은 횟수로 생성된 랜덤 숫자가 완전히 같고 다음은 테스트 코드입니다.

Random r1 = new Random(10);
Random r2 = new Random(10);
for(int i = 0;i < 2;i++){
     System.out.println(r1.nextInt());
     System.out.println(r2.nextInt());
}
이 코드에서 대상 r1과 r2가 사용하는 피드 수는 모두 10이며, 이 두 대상이 같은 횟수로 생성된 무작위 수는 완전히 같다.
랜덤 숫자가 같은 상황을 피하려면 프로젝트에서 몇 개의 랜덤 숫자를 생성해야 하든지 간에 하나의 Random 대상만 사용하면 된다는 것을 주의해야 한다.
b. Math 클래스의 random 방법
사실 Math류에도 랜덤 방법이 있는데 이 랜덤 방법의 작업은 [0,1.0) 구간의 랜덤 소수를 생성하는 것이다.
Math 클래스의 원본 코드를 읽으면 Math 클래스의random 방법은 Random 클래스의nextDouble 방법을 직접 호출하여 실현하는 것을 알 수 있다.
단지 랜덤 방법의 호출이 비교적 간단하기 때문에 많은 프로그래머들이 Math류의 랜덤 방법으로 랜덤 숫자를 생성하는 것에 익숙하다.

좋은 웹페이지 즐겨찾기