범위가 [min-max]입니다. 최소 및 최대은 double
입니다. 이 간격을 n 개의 등 간격으로 나누고 싶습니다. (n은 정수). 자바에서 어떻게 이것을 할 수 있습니까?범위를 n 개의 등수로 나누는 방법은 무엇입니까?
예 : 은 [10-50]
입니다. 및 n=4
. 출력이 그런 분부터 @Achintya 사용 무슨 소용이 무엇 당신이 할 수 [10-20] [20-30][30-40] [40-50]
범위가 [min-max]입니다. 최소 및 최대은 double
입니다. 이 간격을 n 개의 등 간격으로 나누고 싶습니다. (n은 정수). 자바에서 어떻게 이것을 할 수 있습니까?범위를 n 개의 등수로 나누는 방법은 무엇입니까?
예 : 은 [10-50]
입니다. 및 n=4
. 출력이 그런 분부터 @Achintya 사용 무슨 소용이 무엇 당신이 할 수 [10-20] [20-30][30-40] [40-50]
, double dist = (double)(max-min)/n;
같은 범위의 목록이어야합니다, 그것에 DIST를 추가하고 그 첫 번째 구간의 최대이다. 그래서 당신이 여기에서 필요로하는 작은 범위의 한계에 대한 공식이다 [min, min + dist], [min + dist, min + 2*dist]...
int counter = 0;
while(true) {
CreateInterval(min + counter*dist, min + (counter+1)*dist);
if (min+(counter+1)*dist >= max) {
//if we have reached the max, we are done
break;
}
}
dist를 계속 최소로 유지한다면 많은 수의 범위에서 반올림 오류를 얻을 수 있습니다. 범위 카운트에 dist를 곱한 다음 현재 범위를 최소화하려면 최소 범위에 더하는 것이 좋습니다. –
@GilbertLeBlanc 죄송합니다. 귀하가 말씀하신 두 가지 방법의 차이점을 알 수는 없습니다. dist는 반올림 한 더블이기 때문에 많은 수의 범위에서 반올림 오류가 발생하지만 두 번째 방법에 대해 더 설명해 주시겠습니까? – Calpis
그는 반올림 오류가있는 여러 개의 dist를 추가하는 대신 하나의 연산이기 때문에 카운터에 의해 여러 개의 dist를 의미한다고 생각합니다. 나는 주장의 진실을 증명할 수 없다. 단지 적은 수의 오퍼레이션이있을 것이라는 것이다. (그것은 더 적은 반올림 에러가 있다는 것을 분명히하지 않는다.) – rliu
min + n*dist >= max.
때까지
는 그래서 뭔가 같은 것. 먼저 각각의 작은 범위의 길이를 계산함으로써 시작할 수 :
:// let range be [start, end]
// let the number of smaller ranges be n
double total_length = end - start;
double subrange_length = total_length/n;
그런 각 단계에서 상기 계산 된 값과 전류 범위의 좌단으로 이동 작은 범위에 대한 간단한 사이클을 수행 한 후
double current_start = start;
for (int i = 0; i < n; ++i) {
System.out.printl("Smaller range: [" + current_start + ", " + (current_start + subrange_length) + "]");
current_start += subrange_length;
}
두 가지 요소 (최소 및 최대)
double[] range = new double[] {min, max};
int n = 4;
와 배열의 형태로 주어진 범위가있는 경우는이 방법을 시도 할 수 있습니다. divideRange
에서 얻은 것은 주어진 범위의 하위 범위가있는 2 차원 배열이며 각 범위는 원하는 길이를가집니다.
public double[][] divideRange(double[] range, n) {
double[][] ranges = new double[n][2];
double length = (range[1] - range[0])/n;
ranges[0][0] = range[0];
ranges[0][1] = range[0]+length;
for(int i = 1; i < n; i++) {
ranges[i][0] = ranges[i-1][1];
ranges[i][1] = ranges[i-1][1]+length;
}
return ranges;
}
double interval = (double) (max-min)/n; –
그냥 똑같이 나누거나 무작위로 배포하고 싶습니까? – vidit
@AchintyaJha 질문을 업데이트했습니다. – Inquisitive