// 计算随机情况下HASH碰撞率
// 不碰撞率
// f(N,1) = 1.0;
// f(N,2) = 1.0-1/N;
// f(N,k+1) = f(N,k)*(N-k)/N
// f(N,k) = (N-1)*(N-2)...(N-(k-1))/(N^(k-1))
// 大约算法:
// 根据: 当x接近0的时候, 1+x = e^x
// 设 p = (k*k)/(2.0*N)
// f(N,k) = 1.0/(e^p);
//
// 碰撞率: 1.0 - f(N,k)
// 来自:
// http://hi.baidu.com/%D1%BC%B5%B0%BF%C7%B6%F9/blog/item/92725df68332be2bbd31095d.html
// 经验数据
// 当 k*k = N 的时候, 可近视认为碰撞率为 40%
#include "stdafx.h"
double getRate(long k, long N)
{
if(k > N)
return 1.0;
if(k<=1)
return 0.0;
const double fN = N;
double rate = 1.0;
for (long i = N-1; i > N-k; i--)
{
rate *= i/fN;
}
return 1-rate;
}
int _tmain(int argc, _TCHAR* argv[])
{
double fk1 = getRate(23, 365);
double fk2 = getRate(10000, 0x7FFFFFFF);
double fk3 = getRate(100000, 0x7FFFFFFF);
return 0;
}