javascript - 필터 - 숫자 발생기




지정된 범위의 난수 생성-다양한 경우(int, float, inclusive, exclusive) (2)

다음 두 가지 도우미 함수를 정의한 다음 그 값을 사용하는 것으로 시작하겠습니다. 이러한 방법은 B 사례에 대한 정의입니다.

int nextInt(int min, int max) {
    return Math.floor(Math.random() * (max - min)) + min;
}

float nextFloat(float min, float max) {
    return Math.random() * (max - min) + min;
}

그런 다음 정수

  • A : return nextInt (min + 1, max);
  • B : return nextInt (min, max);
  • C : return nextInt (min + 1, max + 1);
  • D : return nextInt (min, max + 1);

수레 는 좀 더 복잡한 경우입니다. 일부는 종점이 포함되는지 여부에 별다른 차이가 없다고 주장 할 수도 있습니다. 특히 종점이 거의 선택되지 않기 때문에 종결 된 솔루션이 종결 된 솔루션 대신 사용될 수 있습니다. 그러나 모든 시나리오를 완벽하게 구현할 수 있으므로 어떻게 수행 할 수 있는지 수학적 관심이 있다고 생각합니다.

A : 이 경우 잘못된 값이 다시 롤백되는 것을 간단하게 확인할 수 있습니다.

float f; 
do {
    f = nextFloat(min, max);
} while (f == min);
return f;

비:

return nextFloat(min, max);

C : 여기서 끝점을 전환하기 만하면됩니다.

float f = nextFloat(min, max);
if (f == min) {
    return max;
}
return f;

D : 이것은 모두의 가장 복잡한 시나리오이지만 다음과 같이 달성 될 수 있습니다.

float f = nextFloat(min, max);
if (f == min) {
    return max;
}
return nextFloat(min, max);

사례 A와 D는 하나 이상의 임의의 숫자를 생성해야 할 수도 있다는 의미에서 약간 더러 우며, 이는 특정 시나리오에서 문제가 될 수 있습니다. 이를 해결하려면 대체 구현을 찾기 위해 부동 소수점 사양을 자세히 파악해야합니다. 또한, D의 경우 최대 값의 가역성은 참조 된 함수가 완전히 균일하면 (일반적으로 그렇지 않은 경우) 다른 어떤 수보다 매우 약간의 가단성을 갖지만 일반적으로 이것은 단지 이론적 인 문제라는 점에 유의해야합니다. (정확하게 말하면, 범위 내에 n 개의 가능한 값이있는 경우, 최대 값 pmax = 1 / (n-1) 및 다른 값의 가설성은 (1-pmax) / (n-1)입니다.

부동 소수점 경우 A의 정확한 구현에서주의해야 할 약간의 문제가 발견되어야합니다. 함수의 호출자가 인접한 부동 소수점으로 호출 할 가능성이 있습니다. 이것은 파라미터의 더미 체크에 의해보기가 쉽지 않기 때문에 루프가 실행될 수있는 횟수에 제한이있어 야합니다.

범위를 지정하기 위해 [0,1]과 min max 값 사이의 수를 반환하는 Math.random() 함수가 주어지면 다음과 같은 경우에 대해 숫자를 생성 할 수 있습니다.

정수가 필요한 경우 :

  • A: (min,max) ?
  • B: [min,max) return Math.floor(Math.random() * (max - min)) + min;
  • C: (min,max] ?
  • D: [min,max] return Math.floor(Math.random() * (max - min + 1)) + min;

우리가 원하는 float :

  • A: (min,max) ?
  • B: [min,max) return Math.random() * (max - min) + min;
  • C: (min,max] ?
  • D: [min,max] ?

정수:

  • A : return Math.floor(Math.random() * (max - min - 1)) + min + 1;
  • B : 맞음
  • C : [min + 1, max + 1]과 같으므로 다음과 같습니다. return Math.floor(Math.random() * (max - min)) + min + 1;
  • D : 수정

float의 경우 부동 소수점 연산의 종류를 알아야합니다. 특수 라이브러리를 사용하지 않는 한, float의 평등은 일반적으로 발생하지 않는 것이므로 닫힌 범위를 갖는 것은 사실이 아닙니다. 이와 같이 네 가지 사이에는 차이가 없어야하며, 함께 갈 수 있습니다.

return Math.random() * (max-min) + min;

질문을 이해하려면 평등을위한 최소 허용 범위 (예 : r=0.00000000000000001 )를 정의해야합니다. 그 후에는 개방 범위 방정식 (즉, (min, max) )을 [min+r, max-r] 변환 할 수 있습니다.







range