http://topic.csdn.net/u/20111011/09/072cf7a1-6235-428a-966f-4e1227197036.htmlOrder By (设定分数-当前分数) * 随机如果设定的为1,10道题目初始为0,其中一题错误扣分后为-1
那就变成
2*随机和1*随机的排序了,2*随机出现的概率有一半了,变成了做错一题后不断的重复做这题,而不是我想要的11分之2的概率。

解决方案 »

  1.   

    你说的分,指的是题目的权重啊?
    分析一下你说的,
    最初,题目的权重都相等,出题概率也相等。
    随着不断的做题,根据做错做对的次数,改变题目的权重,从而改变出题的概率,达到权重越小的,出题概率越高。
    设某题权重为x,那么当他被选中并做题后,如果作对了,x=x+1,如果做错了,x=x-1.然后题库中总题数为y。每次从y中选择一个题,选择的依据是权重越低的,概率越高。那你需要的就是一个算法,可以根据权重分配来获得一个具体的权重值,然后根据这个值来随机获得对应权重的题目。
      

  2.   

    我现在用一个很繁琐的方法首先查询,得到一个 id 和 标准分-得分的差 的集合
    然后遍历这个集合,增加一个累计字段,每个累计为前一个累计加本题的那个差值权重,第一题就不用加前面的累计了。
    然后随机生成一个小于差值权重的合计
    然后查询得到累计字段大于随机生成的第一条记录,根据这个id再去数据库查询这条记录
      

  3.   


    class Program
        {
            static Random rand = new Random(DateTime.Now.Millisecond);
            static void Main(string[] args)
            {
                int[] scores = { 0, 0, 0, 0, -1, 0, 0 };
                int scoreMax = 1;
                int selectCount = 3;            var list = Enumerable.Select(scores, (data, index) => new { number = index, score = data, weight = scoreMax - data });            var q = (from d in list select new { number = d.number, score = d.score, weight = d.weight, pro = Rnd(d.weight, list.Sum(t => t.weight)) ? d.weight : 0 });
                q = (from c in q
                     orderby c.weight descending
                     orderby c.pro descending
                     select c).Take(selectCount);
                //q.ToList().ForEach(r => Console.WriteLine("编号:{0} 分数:{1} 权重:{2} 概率:{3}", r.number, r.score, r.weight, r.pro));
                int testCount =1000000;
                Enumerable.Range(0, testCount).SelectMany(i => q)
                    .GroupBy(s => s.number, (k, subs) => new { number = k, count = subs.Count() })
                    .OrderByDescending(s => s.count)
                    .ToList().ForEach(r => Console.WriteLine("编号:{0} 出现次数:{1}", r.number, r.count));
                Console.Read();
            }        static bool Rnd(int weight, int sum)
            {
                int r = rand.Next(0, sum);
                if (r < weight)
                {
                    return true;
                }
                return false;
            }
        }
    result:编号4:出现次数 978351
    编号0:出现次数 894188
    编号1:出现次数 637900
    编号2:出现次数 124405
    编号3:出现次数 123755
    编号5:出现次数 121790
    编号6:出现次数 119611
      

  4.   

    当 int[] scores = { 0, 10, 20, 30, 40, 50, 60 };result:
    编号0:出现次数 985537
    编号1:出现次数 948235
    编号2:出现次数 788074
    编号3:出现次数 140894
    编号4:出现次数 92080
    编号5:出现次数 45180编号6因为和目标分数一样了,已经不需要出现了,刚好Rnd函数可以避免这个出现
    一个思路,我算法不好,LZ随便看看好了