2013-10-02 6 views
2

Math.random()을 사용하여 2로 증가하는 난수를 어떻게 생성합니까? 예를 들어, (2,4,6,8) 세트에서 임의의 숫자를 생성하려고합니다. 어떻게할까요?자바에서 임의의 숫자를 생성하는 방법

+2

정수 오버 플로우를 처리하거나 인수에 오류 서명하지 않는다는 것입니다 '생성 '난수? 숫자 배열에서 임의의 인덱스를 선택하기 만하면됩니까? – Rohan

답변

5

이 특정 세트의 경우에는 여기

(int)(Math.random() * 4) * 2 + 2 

사용할 수 :

  • Math.random()가 0.0보다 크거나 같고 1.0보다 엄격 이하의 수를 생성하고,
  • (int)(... * 4)는 3
  • ... * 2 + 2은 2 일, 4, 6, 8
+0

당신은 그 세트가 * 항상 * 특정 산수 시리즈라고 가정하고 있습니다. – hexafraction

+0

@hexafraction : 그렇습니다. OP가이 특정 세트가 아닌 다른 것 이후에 있다는 질문에 아무런 표시가 없습니다. – NPE

+0

@hexafraction * "두 자리 위로 올라가는 숫자"* – arshajii

0
int[] numSet={2,4,6,8}; 
Random myRand=new Random(); 
int myNum=numSet[myRand.nextInt(numSet.length)]; 
이 번호 배열을 생성

제공, 0 일, 1, 2, 임의 오브젝트를 준다 그런 다음 숫자 배열에서 임의의 요소를 선택합니다. 이것은 숫자가 어떤 종류의 수학적 계열에 있다고 가정하지 않습니다. 그것들은 11, 25, 31, 876, 984368, 7432, 84562 일 수 있습니다.

y 값에서 해당 세트를 생성하는 다항식이 있음을 말하지 마십시오. 알아.

+0

세트가 100 만 가지가되면 어떻게 될까요? 모든 숫자를 불필요하게 배열에 저장해야합니다. – arshajii

+0

@arshajii 현재의 원래 질문의 애매 성을 감안할 때, OP의 매개 변수를 모르기 때문에 모든 대답이 부분적으로 정확하고 부분적으로 작동하지 않을 수 있습니다. AFAICT에서 5 분짜리 창 수정이 있었지만 너무 확신 할 수는 없습니다. – hexafraction

+0

여기에 약간의 위험이 있습니다. 누군가이 코드를 그대로 복사하고 각각의 새로운 선택에 대해 새로운 Random() 객체를 만드는 것은 동일한 Random 객체의 연속 값보다 훨씬 덜 "임의"입니다. 그래도 코더가 해당 객체를 한 번만 생성하고 다중 호출 또는 반복에 대해 재사용 할 때는 스레드 안전성이 높기 때문에주의해야합니다. –

0

해당 숫자를 배열에 넣습니다. 배열의 길이 - 1을 사용하여 난수를 생성하고 인덱스로 사용하여 배열 요소를 임의로 선택합니다.

0

또한이 같은 java.util.Random의 클래스를 사용할 수 있습니다 :

int values[] = {2,4,6,8}; 
    Random randomGenerator = new Random(); 
    int randomInt = randomGenerator.nextInt(values.length); 
    int randomValue = values[randomInt]; /* Here's your random value from your set */ 
2

좋아, 실제 일반적인 솔루션을 만들 수 있습니다.

int lower = 2; 
int upper = 8; 
int step = 2; 
int rand = (int)(Math.random() * (upper-lower+1)); 
int result = rand - rand%step + lower; 

지정한 세트와 다른 세트에서 숫자를 생성하려면 하단 변수, 상단 및 스텝 변수를 설정에 맞게 변경하십시오. 상한이 세트에 있으면 포함합니다.

+1

그 표현에서 (위 아래 -2) 주위에 괄호가 필요합니다. 또한 (rand - % 2)을 (rand & -2)를 사용하여 나눗셈없이 할 수 있습니다. 사업부를 떠나고 싶다면 일반적인 차이점을 지정하는 (단계) 값과 함께 산술 진행을 (위쪽), (아래쪽)으로 설명 할 수있는 좀 더 일반적인 솔루션을 얻을 수 있습니다. –

+0

감사합니다. 그에 맞게 수정하십시오. – spydon

+0

upvote에 적합합니다. :) 나는 또한 당신이 1의 단계를 허용하기 위해 (upper-lower + 2)를 (upper-lower + 1)으로 올바르게 바꿨음을 주목한다. –

0

더 일반적인 대답을 추가하고 싶습니다.

집합에서 가장 작은 정수가 있고 세트의 크기가 같은 것 세트에서 임의의 정수 S.라고 가정 : 자바에서 특정 예를 들어

A + myRandom.nextInt(S) * 2 

, 그것은 것 :

Random myRandom = new Random(); 
int randomNum = 2 + myRandom.nextInt(4) * 2; 
1

(거의) 완전히 일반적인 접근 방식은 그리 어렵지 않습니다. 및 순서의 일부가 아닌 stopstop 경우 이전 stop, 또는 마지막 번호를 포함하여 최대 {start, start+step, start+2*step, ... }에서 임의의 정수를 반환

static randInt(int first, int last, int step) { 
    int nsteps = (last+1-first)/step; 
    return first + step*(int)(nsteps*Math.random()); 
} 

.

int choice = randInt(2, 8, 2); /* random choice from {2, 4, 6, 8} */ 

... 샘플 질문이 해결되었습니다.

(거의) 부분이, 당신은 의미하지 않는다 (step는, step<0first<last, 또는 그 반대의 경우도 마찬가지 제로이다.) 그래서

관련 문제