C#根据权重算出数值
作者:98tj 日期:2009-01-16
说明:
假设有这么一组数据: 1,3,6,7,9其对应的权重为 10,30,50,80,5 现在我们要从这5个值中按他们的权重取数据,
那么总权重是175,每175次取值应该有10次能取到1,30次能取到3,等等,现在根据下面的表示,并考虑上面的算法
0---10-----40----------90---------------170--175
每次取值时的遍历操作按1,3,6,7,9的顺序访问,按上面的条件,随机数的范围应该在1-175,对照上面的算法在随机数取1-10时都符合条件,因此每175次取值应该有10次被取到的机会,对于6它的范围应该是41-90(10+30,10+30+40),那么ranSum为41到90之间数值的可能性为每175次里有50次.由上面过程我们可以看到数据被获取的概率只跟其权重有关,跟算法中数据访问顺序无关.
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string AdList = "1,3,6,7,9";
string AdWeight = "10,30,50,80,5";
Response.Write(ShowStr(AdList, AdWeight));
}
/// <summary>
/// 计算权重总合
/// </summary>
/// <param name="d">权重一维数组</param>
/// <returns></returns>
private int Sum(string[] d)
{
int Sum = 0;
for (int i = 0; i < d.Length; i++)
{
Sum += Convert.ToInt32(d[i]);
}
return Sum;
}
/// <summary>
/// 随机数和权重计算当前数
/// </summary>
/// <param name="a">显示内容一维数组字符串</param>
/// <param name="b">权重一维数组字符串</param>
/// <returns></returns>
private int ShowStr(string a, string b)
{
string[] c = a.Split(',');
string[] d = b.Split(',');
Random rd = new Random(DateTime.Now.Millisecond);
int e = Sum(d);
int f = rd.Next(1, e);
int g = 0;
int h = 0;
for (int i = 0; i < d.Length; i++)
{
g += Convert.ToInt32(d[i]);
if (g >= f)
{
h = Convert.ToInt32(c[i]);
break;
}
}
return h;
}
点击下载此文件
假设有这么一组数据: 1,3,6,7,9其对应的权重为 10,30,50,80,5 现在我们要从这5个值中按他们的权重取数据,
那么总权重是175,每175次取值应该有10次能取到1,30次能取到3,等等,现在根据下面的表示,并考虑上面的算法
0---10-----40----------90---------------170--175
每次取值时的遍历操作按1,3,6,7,9的顺序访问,按上面的条件,随机数的范围应该在1-175,对照上面的算法在随机数取1-10时都符合条件,因此每175次取值应该有10次被取到的机会,对于6它的范围应该是41-90(10+30,10+30+40),那么ranSum为41到90之间数值的可能性为每175次里有50次.由上面过程我们可以看到数据被获取的概率只跟其权重有关,跟算法中数据访问顺序无关.
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string AdList = "1,3,6,7,9";
string AdWeight = "10,30,50,80,5";
Response.Write(ShowStr(AdList, AdWeight));
}
/// <summary>
/// 计算权重总合
/// </summary>
/// <param name="d">权重一维数组</param>
/// <returns></returns>
private int Sum(string[] d)
{
int Sum = 0;
for (int i = 0; i < d.Length; i++)
{
Sum += Convert.ToInt32(d[i]);
}
return Sum;
}
/// <summary>
/// 随机数和权重计算当前数
/// </summary>
/// <param name="a">显示内容一维数组字符串</param>
/// <param name="b">权重一维数组字符串</param>
/// <returns></returns>
private int ShowStr(string a, string b)
{
string[] c = a.Split(',');
string[] d = b.Split(',');
Random rd = new Random(DateTime.Now.Millisecond);
int e = Sum(d);
int f = rd.Next(1, e);
int g = 0;
int h = 0;
for (int i = 0; i < d.Length; i++)
{
g += Convert.ToInt32(d[i]);
if (g >= f)
{
h = Convert.ToInt32(c[i]);
break;
}
}
return h;
}
点击下载此文件评论: 0 | 引用: 0 | 查看次数: -
发表评论
上一篇
下一篇

文章来自:
Tags:
相关日志: