Math.random () 설명


133

이것은 매우 간단한 Java (아마도 모든 프로그래밍에 적용 가능) 질문입니다.

Math.random() 0과 1 사이의 숫자를 반환합니다.

0에서 100 사이의 정수를 반환하려면 다음을 수행하십시오.

(int) Math.floor(Math.random() * 101)

백과 백 사이에서 나는 할 것입니다 :

(int) Math.ceil(Math.random() * 100)

하지만 3에서 5 사이의 숫자를 얻으려면 어떻게해야합니까? 다음 진술과 같습니까?

(int) Math.random() * 5 + 3

나는 알고 nextInt()에서 java.lang.util.Random. 하지만이 작업을 수행하는 방법을 배우고 싶습니다 Math.random().


[3,5]의 경우 :(int)Math.floor(Math.random()*3) + 3
good_evening

9
BTW : 범위는 0.0에서 1.0까지입니다 (1.0을 얻지 못할 것입니다) nextInt ()를 사용하는 것이 훨씬 더 나은 선택입니다. 단순 할뿐만 아니라 훨씬 빠릅니다.
피터 로리

2
Math.ceil잘못 사용하면 , Math.random()반환 할 때 잘못된 결과를 제공 합니다 0.
starblue

Math.floor가 0.029를 반환하면 어떻게됩니까? 한 문장으로 항상 두 자리 숫자를 얻는 방법은 무엇입니까?
Naisheel Verdhan

답변:


165
int randomWithRange(int min, int max)
{
   int range = (max - min) + 1;     
   return (int)(Math.random() * range) + min;
}

randomWithRange(2, 5)10 회 출력 :

5
2
3
3
2
4
4
4
5
4

범위는 포괄적이고, 즉 [2,5]이며 , 위의 예 min보다 작아야합니다 max.

편집 : 누군가가 시도하고 바보와 반대로가는 경우 minmax, 당신은 코드를 변경할 수 있습니다 :

int randomWithRange(int min, int max)
{
   int range = Math.abs(max - min) + 1;     
   return (int)(Math.random() * range) + (min <= max ? min : max);
}

EDIT2 :double s에 대한 질문은 다음과 같습니다.

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}

그리고 당신이 바보 증거를 원한다면 그것은 단지 :

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}

1
사용하지 않고 ? (int)를 반환 하려면 어떻게해야 double합니까?
switz

double을 원하면 ints를 doubles로 바꾸십시오 (typecast는 필요하지 않습니다). 님이 원한다고 생각 int했지만 게시물에 추가하겠습니다.
AusCBloke 2

2
사실과 doubles를 제거 + 1하기 때문에 또한 Math.random()잘립니다되지 않습니다. 그러나 Math.random"0.0보다 크거나 같고 1.0보다 작은 양의 부호를 갖는 이중 값을 반환합니다."이므로이 범위는 [최소, 최대] 입니다. max가능하더라도 숫자가 정확하게 나타날 가능성은 매우 적습니다 .
AusCBloke

44

0에서 100 사이의 숫자를 생성하려면 코드는 다음과 같습니다.

(int)(Math.random() * 101);

10에서 20까지의 숫자를 생성하려면 다음을 수행하십시오.

(int)(Math.random() * 11 + 10);

일반적인 경우 :

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

( lowerbound포함하고 upperbound배타적 인 곳).

포함 또는 제외는 upperbound선택 에 따라 다릅니다. range = (upperbound - lowerbound) + 1그때 upperbound는 포괄적이지만, range = (upperbound - lowerbound)그렇다면 upperbound독점적 이라고 가정 해 봅시다 .

예 : 3-5 사이의 정수를 원한다면 범위가 (5-3) + 1이면 5가 포함되지만 범위가 (5-3)이면 5는 배타적입니다.


2
upperbound독특한? 나는 그것이 포괄적 일 것이라고 생각한다.
vidit

1
@vidit 그것은 독점적이다

1
예제에서 제공 한 것처럼 큰 그림 상한선이 될 수 있다고 생각하지 마십시오
Teezy7

19

Random에있는 자바 클래스 java.util패키지는 목적은보다 나은 서비스를 제공 할 것이다. 그것은 몇 가지가 nextInt()정수를 반환 방법. int 인수를 취하는 것은 0에서 int 사이의 숫자를 생성하며 후자는 포함하지 않습니다.


질문을 업데이트했습니다 Math.random().로 어떻게하는지 알고 싶습니다 . 감사.
스위스

1

10에서 20 사이의 숫자를 생성하려면 다음을 사용할 수 있습니다. java.util.Random

int myNumber = new Random().nextInt(11) + 10

0

다음은 경계를 받고 임의의 정수를 반환하는 방법입니다. 약간 더 진보되어 있습니다 (완전 보편적) : 경계는 양수와 음수 모두 가능 하며 최소 / 최대 경계는 어떤 순서로나 올 수 있습니다.

int myRand(int i_from, int i_to) {
  return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

일반적으로 경계 사이의 절대 거리를 찾고 관련 임의의 값을 얻은 다음 아래쪽 경계를 기준으로 답을 이동합니다.

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