C#根据权重算出数值

说明:
假设有这么一组数据: 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;
    }

下载文件 点击下载此文件


[本日志由 98tj 于 2009-01-16 09:13 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 权重 概率
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.