2011-05-13 4 views
5

나누기에 적절한 결과를 제공하는 임의의 숫자를 생성하는 방법 (즉, 결과는 소수점 이하 1 자리 또는 2 자리로 반올림해야 함).나누기에서 적절한 결과를 제공 할 난수를 생성하는 방법

(예 : 소수 결과를 제공 진수로 정수 - 나는 아래 샘플 입력의 집합 준)

2827 by 2.5 = 1130.8 
1747 by 0.8 = 2183.75 
425 by 0.4 = 1062.5 
935 by 0.8 = 1168.75 
+1

범위는 제수와 배당금 어떻게해야합니까? –

+4

답변이 없으므로 주석으로 게시하겠습니다.하지만 솔루션에 영향을 미칠 수 있으므로이 백서를 이해하십시오. http://download.oracle.com/docs/cd/E19957-01/ 806-3568/ncg_goldberg.html – JasCav

+1

숫자 중 임의의 숫자 - 약수 또는 배당금은? 정확히 1 또는 2 소수 자릿수가 필요한 경우 왜 정수로 작업 할 수 없으며 나중에 100으로 나눕니다? –

답변

3

그것은 모든 정수가 0.4, 0.8 또는 2.5로 나눈 될 수 있음을 주목할 필요가있다 소수 자릿수 2 자리로 표시 할 수 있습니다. 이 2.5, 1.25를 곱과 동일하고, 0.4


그러나이 사실이 아니라는되는 제수가있는 경우, 당신은 루프에서이 작업을 수행 할 수 있기 때문이다.

double divisor = 2.4; 
double factor = 100/divisor; 
Random rand = new Random(); 
int maxValue = 1000; 
double ERROR = 1e-14*maxValue; 

for(int i=0;i<100;i++) { 
long randNum; 
do { 
    randNum = rand.nextInt(maxValue+1); 
    if (Math.abs(randNum * factor - (long) (randNum * factor)) > ERROR) 
     System.out.println("reject "+randNum + " => "+randNum/divisor); 
} while(Math.abs(randNum * factor - (long) (randNum * factor)) > ERROR); 
System.out.println(randNum + " => "+randNum/divisor); 

인쇄

729 => 303.75 
285 => 118.75 
84 => 35.0 
123 => 51.25 
999 => 416.25 
75 => 31.25 
reject 727 => 302.9166666666667 
reject 842 => 350.83333333333337 
504 => 210.0 
reject 368 => 153.33333333333334 
441 => 183.75 
579 => 241.25 
165 => 68.75 

는 0.01의 배수 인 수있을 때까지이 난수를 생성합니다.

+0

코드를 어떻게 호출해야합니까? 해결책은 무엇입니까? 나는 정수 (randNum : = long)와 거의 정수 (randNum * factor) 만 산출한다. '14600.000000000002, 38000.0, 31300.000000000004, 25500.0, 11300.0, 37900.0, ... '어쩌면 내가 잘못 호출했거나 초기화 중입니까? –

+0

내 생각 엔 반올림 오류를 관리하지 않는 것 같습니다. 반올림 오류가 발생하는 작업이 있으면 인쇄 할 때 서식을 지정해야합니다. –

+0

그래서 .0, .25, .5 및 .75를 생산합니까? .01, .02, ... .89, .99와 같은 모든 부분은 전체 구역이 아니라 생산되어야한다는 것을 이해했습니다. –

1

결과를 '소수점 이하 2 자리로 반올림'(실제로는 반올림하지 않음, 소수점 2 자리가있는 유한 십진수 표현), 제수를 생성하고 항상 배당금을 100으로 설정하십시오. :

106250/100 = 1062.5 
116875/100 = 1168.75 

더 흥미로운 배당을 원한다면 제수와 배당을 나누십시오. 예 : 첫 번째는 어느 하나 일 수

(/1): 106250/100 = 1062.5 
(/2): 53125/50 = 1062.5 
(/10): 10625/10 = 1062.5 
(/4): 26562.5/25 = 1062.5 
(/125): 850/0.8 = 1062.5 
+0

내 샘플은 전체 숫자를 소수점으로 나눈 값이며, 소수점 이하 2 자리 이하의 최대 값을 갖는 답을 생성합니다. 귀하의 견본은 부정확 한 정수 단위로 보여줍니다. – Joe

+2

@ Joe : 예를 들어 ' 의미, 이것은 그것을 할 수있는 방법 중 하나, 그것을 할 수있는 유일한 방법이 아닙니다. 더 분명해야한다. – Claudiu

4
res = input * random.nextInt (100)/100.0; 

설명 :

당신은 정수을 N, 그리고 뭔가를 곱합니다. 이 항목이 34.56과 같은 숫자 인 경우 십진수 w 앞의 부분 (전체 부분)과 .xy 뒤에있는 부분을 호출합니다.

이것을 n과 곱하면 (n * w) + (n * (x/10)) + n * (y/100)로 끝납니다. 도트 뒤에 세 부분으로 된 암호는 절대로 없을 것입니다 - 동의하십니까?

우리는 하나의 부분에 X 및 Y를 결합하고, (n 개 *의 w) + (N 개의 *는 (XY/100)), 및 XY가 100

0에서 무언가 이름 만 말할 수 10 진수 점 앞에있는 부분은 임의적으로 커질 수 있으므로 0이 아닌 다른 것이 필요할 경우 별도로 계산할 수 있습니다. 그러나 범위를 어떻게 든 정의해야합니다. 해당 부분에 대해 임의의 정수 R을 취하는 경우 :

res = input * R * random.nextInt (100)/100.0; 

제수 explicityl이 필요합니까? 코드 fragmenst를 테스트 할 때

div = 100.0/(R * random.nextInt (100)); 

스칼라는 항상 편리 :

val r = util.Random 
r: util.Random.type = [email protected] 

scala> def res (input: Int) = input * r.nextInt (100)/100.0; 
res: (input: Int)Double 

scala> (1 to 20).map (res) 
res338: scala.collection.immutable.IndexedSeq[Double] = 
Vector(0.48, 1.58, 0.48, 2.8, 0.15, 1.98, 5.67, 3.36, 6.93, 6.0, 9.02, 0.48, 7.41, 6.44, 9.6, 1.92, 16.66, 5.94, 7.98, 18.4) 
0

나를 위해 배당 및 제수는 모두 임의의 숫자입니다. 나는 소수점 이하 2 자리수를 반올림하지 않아도되는 대답을 만들어야한다.

이 경우 대답은 "해당 번호가 없습니다"일 수 있습니다.

import java.text.DecimalFormat; 

public class Test { 
    public static void main(String[] args) { 
     double num = Math.PI; 
     DecimalFormat format = new DecimalFormat(
       "####################################0." + 
       "00##############################"); 
     while (true) { 
      for (int i = 1; i < Integer.MAX_VALUE; i++) { 
       double tmp = (i/num) * 100; 
       if (tmp == (long) tmp) { 
        System.err.println("Solution - " + i + " - " + 
          format.format(tmp) + " - " + format.format(num)); 
        break; 
       } 
      } 
      pi = Math.nextAfter(num, 1); 
     } 
     System.err.println("No solution for " + format.format(num)); 
    } 
} 

나는 10 분 동안이 작업을 실행 (PI에서 시작), 및 해결책 i 없었다 num의 값을 찾을 수 없습니다 : 여기이 가설을 테스트하기 위해 쓴 작은 자바 프로그램입니다. 그러나 솔루션이 매우 희소 할 수 있음을 관찰했습니다. 예 :

Gotcha! - 179453441 - 5712180438.00 - 3.1415926535897714 

해당 제수에 대한 해결책을 찾는 데 1 억 7 천 9 백만 번의 시도가 필요했습니다.

0

setRoundingMode를 사용하여 반올림 모드를 설정 한 다음 필요한 출력에 형식 패턴을 사용하십시오.

확인이 post ....

관련 문제