百度空间 | 百度首页 
 
查看文章
 
Zipf定律实现(C#)
2007-05-09 11:05

public class ZipfSelect
{
   static Random rng = null;
   int numDataElements;//数据元素总数
   double[] sums;
   bool defaultSelectZipf = true;
   double a = 1.0;//(1/r^a)
   public ZipfSelect(int numDataElements,double e)
   {
    a = e;
    this.numDataElements = numDataElements;
    sums = new double[numDataElements];
    double sum = 0.0;


    for (int i = 0; i < sums.Length; i++)
    {
     //SkipNet加2,为什么不是加1或其他数字?本人尚不清楚
     sum += 1.0 / Math.Pow((double)(i+2),a);
    }
    for (int i = 0; i < sums.Length; i++)
    {
     if (i == 0)
      sums[i] = 1.0 / Math.Pow((double)(i+2),a)/ sum;
     else
      sums[i] = sums[i-1] + 1.0 / Math.Pow((double)(i+2),a)/ sum;
    }
   }
   public static void SetRandomSeed(int seed)
   {
    r = new Random(seed + 13);
   }

   public void SetDefaultToUniform()
   {
    this.defaultSelectZipf = false;
   }

   public int Pick()
   {
    return Pick(this.defaultSelectZipf);
   }

//取得数据元素索引  
public int Pick(bool zipfSelect)
   {
    int indx;
    if (zipfSelect)
    {
     double u = r.NextDouble();
     indx = 0;
     while (u > sums[indx]) indx++;
    }
    else
    {
     indx = r.Next(this.numDataElements);
    }
    return indx;
   }
}


类别:.net学习 | 添加到搜藏 | 浏览() | 评论 (3)
 
最近读者:
 
网友评论:
1
2007-05-11 21:46 | 回复
C#的水品不错呀!
 
2
2007-07-28 22:21 | 回复
百度到你,学习了。
 
3
2009-09-27 08:06 | 回复
不错不错
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu