随机生成n个数据,其数据遵循齐夫分布
一.齐夫定律概念
在自然语言的语料库里,一个单词出现的次数与它在频率表里的排名成反比。其实与八二法则有异曲同工之妙,举个例子就是说:20%的内容有着80%的访问量,80%的内容只有20%的访问量。也就是说:所有变量中,最重要的仅有20%,虽然剩余的80%占了多数,控制的范围却远低于“关键的少数”。
二.实例说明:
如果要生成50个整数,遵循zipf定律,范围在10-30之间,其结果如下:
11,17,24,10,19,14,28,28,12,14,15,15,11,17,11,21,25,12,17,26,21,14,12,23,22,12,11,26,28,25,17,16,21,28,19,22,17,29,25,24,13,21,12,23,23,14,11,21,23,18。
三.程序如下:
位置频率累加求和
void gene()
{
float sum = 0.0;
for (int i = 0; i < R; i++)
{
sum += C/pow((float)(i+2), A); //位置为i的频率,一共有r个(即秩), 累加求和
}
for (int i = 0; i < R; i++)
{
if (i == 0)
pf[i] = C/pow((float)(i+2), A)/sum;
else
pf[i] = pf[i-1] + C/pow((float)(i+2), A)/sum;
}
}
设置参数,范围,生成个数
void results(int n)
{
int nums[n];
float arr[n];
int k;
//产生n个数
for (int i = 0; i < n; i++)
{
int index = 0;
int temp;
float data1;
//srand( ( unsigned )time( NULL ) );
int data=10+rand() %40;
nums[i]=data;
cout<<data<<",";
data1 = data*0.01;
while (data1 > pf[index]) //找索引,直到找到一个比他小的值,那么对应的index就是随机数了
index++;
}
}
设置生成个数
int main()
{
gene();
results(100);
return 1;
}