범위에서 임의의 이중 생성


143

나는 다음과 같은 두 복식이 있습니다

double min = 100;
double max = 101;

랜덤 생성기로 최소값과 최대 값 사이의 이중 값을 만들어야합니다.

Random r = new Random();
r.nextDouble();

그러나 여기서 범위를 지정할 수있는 곳은 없습니다.

답변:


237

사이의 임의의 값을 생성하는 방법 rangeMinrangeMax:

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();

21
이것은 일반적으로 정확하지만 한계에주의하십시오. 당신이 경우에 double rangeMax= Double.MAX_VALUE;그리고 double rangeMin= -rangeMax;당신은 항상 대가로 무한한 가치를 얻을 것이다. 를 확인하고 싶을 수도 있습니다 Double.valueOf(rangeMax-rangeMin).isInfinite().
lre

범위가 0.0-1.0보다 큰 경우이 결과는 종종 원하는 범위의 많은 이중 값을 제외합니다. 원하는 범위에 0.0-1.0 범위보다 많은 수의 값이 포함 된 경우 각 값에 대한 값이 없으며 생성되지 않습니다. (비둘기 구멍 원리로!). 이로 인해 Tunaki의 솔루션 이 더 좋습니다.
Lii

@Lii 왜 그들 각각에 대한 가치가 없을까요?
Kartik Chugh

1
@ K_7 : 예를 들어 0.0과 1.0 사이에 10,000 개의 고유 한 이중 값이 있다고 가정하십시오 (실제로는 더 많을 수도 있음). 그러나 rangeMin와 사이의 범위 rangeMax가 크면 그 사이에 10,000,000 개의 고유 한 이중 값이있을 수 있습니다. 결과는 (rangeMax - rangeMin) * r.nextDouble()10,000,000 개의 가능한 값 중 10,000 개만 선택합니다. (나는 이것이 완벽한 설명이 아니라고 생각하지만 약간 도움이 될 것입니다 ...)
Lii

1
아 알 겠어요 기본적으로 유한 한 값 집합을 사용할 수있는 숫자를 곱해도 해당 집합의 크기는 변경되지 않습니다.
Kartik Chugh

138

이 질문은 Java 7 릴리스 이전에 요청되었지만 이제 Java 7 (이상) API를 사용하는 또 다른 방법이 있습니다.

double random = ThreadLocalRandom.current().nextDouble(min, max);

nextDouble최소 (포함)와 최대 (제외) 사이의 의사 난수 double 값을 반환합니다. 경계가 반드시 필요한 것은 아니며 int가능할 수도 있습니다 double.


6
호출 API를 21 필요
자르 E Ahmer

2
@XarEAhmer API 21이란 무엇입니까?
Abhijit Sarkar

그가 Android를 말하는 것 같습니다.
Kartik Chugh

40

이것을 사용하십시오 :

double start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);

편집하다:

new Random().nextDouble(): 0과 1 사이의 숫자를 임의로 생성합니다.

start: 시작 번호, 번호를 "오른쪽으로"이동

end - start: 간격. random은 0에서 1까지의 숫자를주기 때문에이 숫자의 0 %에서 100 %까지를 제공합니다.


편집 2 : Tks @daniel 및 @aaa bbb. 내 첫 대답은 틀렸다.


4
import java.util.Random;

public class MyClass {
     public static void main(String args[]) {
          Double min = 0.0;  // Set To Your Desired Min Value
          Double max = 10.0; // Set To Your Desired Max Value
          double x = (Math.random() * ((max - min) + 1)) + min;   // This Will Create A Random Number Inbetween Your Min And Max.
          double xrounded = Math.round(x * 100.0) / 100.0;   // Creates Answer To The Nearest 100 th, You Can Modify This To Change How It Rounds.
          System.out.println(xrounded);    // This Will Now Print Out The Rounded, Random Number.
     }
}

0
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
    //do
}

0

랜덤의 주요 아이디어는 의사 난수 값을 반환한다는 것입니다. 완전 랜덤 함수와 같은 것은 없으므로 동일한 시드를 사용하는 2 개의 랜덤 인스턴스는 특정 조건에서 동일한 값을 반환합니다.

doc 함수를 이해하려면 먼저 doc 함수를 보는 것이 좋습니다 ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

nextDouble () 함수의 반환 값이 0.0과 1.0 사이의 의사 난수 값이라는 것을 이해 했으므로이 값을 유리하게 사용할 수 있습니다.

경계가 유효한 (A> B) A와 B givin '사이에 난수를 만들려면 다음을 수행해야합니다. 1. A와 B 사이의 범위를 찾아서 여러 "단계"를 수행하는 방법을 알 수 있습니다. 2. random 함수를 사용하여 수행 할 단계 수를 결정합니다 (반환 된 값이 0.0과 1.0 사이이므로 "임의의 임의 백분율 증가"로 생각할 수 있음). 3. 오프셋 추가

그 후, 당신은 폭도들이 당신에게 내 의견으로는 가장 쉽고 가장 일반적인 방법을 제공했음을 알 수 있습니다

double randomValue = rangeMin + (rangeMax-rangeMin) * r.nextDouble ();

double RandomValue = 오프셋 + (범위) * (0.0-1.0 사이의 randomVal)

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