문자 세트의 크기가 주어진 길이의 분포를 계산할 수 없습니까?
k
는 문자열
k
보다 짧은 길이의 문자열에 대한 길이의 비율을 결정한다. 이것은 다음에서 유래합니다 :
wikipedia.
그래서, 최대한의 문자열을 가정 한 후 무작위로 짧은 문자열의 상대적 기회를 결정합니다.
짧은 반복 볼 수있는 경우 n-1
이하의 경우.
이 접근법은 반올림 오류를 합리적으로 처리한다고 생각합니다. n
이 적당한 크기 일 때 실제로 짧은 문자열을 얻을 확률은 여전히 매우 작지만 대표적입니다.
이 금액을하려면, 우리는 원하는 :
k^n samples of length n
k^(n-1) of length n-1
etc.
k of length 1
1 of length 0
p(length < x)/p(length <= x)
= sum(1+..+k^x-1)/sum(1+..+k^x)
= (1 - k^-x)/ (k-k^-x)
그래서 우리는 다음과 같이 구현할 수 있습니다
int getLength(int n, int setSize)
{
if (n == 0)
return 0;
double oneOverKtoTheN = pow(1.0/setSize, (double)n);
double pLengthN = (1-oneOverKtoTheN)/(setSize - oneOverKtoTheN);
double sample = ((double) rand())/RAND_MAX;
if (sample < pLengthN)
return n;
return getLength(n-1, setSize);
}
oneOverKtoTheN
인해 시작하는 부동 소수점까지 하락하지만, 같은 n
할 수있는 방법을 참고 감소해야한다.
또한보십시오 http://stackoverflow.com/questions/3066707/how-do-i-generate-a-random-string-of-up-to-a-certain-length –
@DavidEisenstat PaxDiablo는 준 거기에 좋은 해결책. –
@JimBalter PaxDiablo는 두 가지 솔루션을 제공합니다. 첫 번째 것은 제 가깝지만 잘못된 분포를 샘플링하고 두 번째는 bignum을 필요로합니다. –