나누기에 적절한 결과를 제공하는 임의의 숫자를 생성하는 방법 (즉, 결과는 소수점 이하 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 자리 또는 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
그것은 모든 정수가 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의 배수 인 수있을 때까지이 난수를 생성합니다.
코드를 어떻게 호출해야합니까? 해결책은 무엇입니까? 나는 정수 (randNum : = long)와 거의 정수 (randNum * factor) 만 산출한다. '14600.000000000002, 38000.0, 31300.000000000004, 25500.0, 11300.0, 37900.0, ... '어쩌면 내가 잘못 호출했거나 초기화 중입니까? –
내 생각 엔 반올림 오류를 관리하지 않는 것 같습니다. 반올림 오류가 발생하는 작업이 있으면 인쇄 할 때 서식을 지정해야합니다. –
그래서 .0, .25, .5 및 .75를 생산합니까? .01, .02, ... .89, .99와 같은 모든 부분은 전체 구역이 아니라 생산되어야한다는 것을 이해했습니다. –
결과를 '소수점 이하 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
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)
나를 위해 배당 및 제수는 모두 임의의 숫자입니다. 나는 소수점 이하 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 백만 번의 시도가 필요했습니다.
setRoundingMode를 사용하여 반올림 모드를 설정 한 다음 필요한 출력에 형식 패턴을 사용하십시오.
확인이 post ....
범위는 제수와 배당금 어떻게해야합니까? –
답변이 없으므로 주석으로 게시하겠습니다.하지만 솔루션에 영향을 미칠 수 있으므로이 백서를 이해하십시오. http://download.oracle.com/docs/cd/E19957-01/ 806-3568/ncg_goldberg.html – JasCav
숫자 중 임의의 숫자 - 약수 또는 배당금은? 정확히 1 또는 2 소수 자릿수가 필요한 경우 왜 정수로 작업 할 수 없으며 나중에 100으로 나눕니다? –