http://topic.csdn.net/u/20111011/09/072cf7a1-6235-428a-966f-4e1227197036.htmlOrder By (设定分数-当前分数) * 随机如果设定的为1,10道题目初始为0,其中一题错误扣分后为-1
那就变成
2*随机和1*随机的排序了,2*随机出现的概率有一半了,变成了做错一题后不断的重复做这题,而不是我想要的11分之2的概率。
那就变成
2*随机和1*随机的排序了,2*随机出现的概率有一半了,变成了做错一题后不断的重复做这题,而不是我想要的11分之2的概率。
解决方案 »
- 引用MicroSoft Excel 11.0 Object Library出现错误,求救。
- 用串口来传输文件,最大化与最小化,速度相差四倍左右
- C#页面 翻页的问题
- 关于银行
- 如何让DataGridView的某一格设为DataGridViewComboBoxCell属性。而不用设置整个列为combox
- 请教:按一定格式读取字符串
- 在html里,能给某个文本赋值吗?或给某个变量赋值?
- 有一个用vb.net开发的软件,怎么转换成c#,运行起来速度有区别吗?
- 如何用openFileDialog的Filter在ShowDialog()的时候同时显示2种指定文件?
- C# Socket通信问题求解
- 提示标准表达式中数据类型不匹配
- Type.GetType("System.Windows.Forms.TreeView")为null,怎么会这样?
分析一下你说的,
最初,题目的权重都相等,出题概率也相等。
随着不断的做题,根据做错做对的次数,改变题目的权重,从而改变出题的概率,达到权重越小的,出题概率越高。
设某题权重为x,那么当他被选中并做题后,如果作对了,x=x+1,如果做错了,x=x-1.然后题库中总题数为y。每次从y中选择一个题,选择的依据是权重越低的,概率越高。那你需要的就是一个算法,可以根据权重分配来获得一个具体的权重值,然后根据这个值来随机获得对应权重的题目。
然后遍历这个集合,增加一个累计字段,每个累计为前一个累计加本题的那个差值权重,第一题就不用加前面的累计了。
然后随机生成一个小于差值权重的合计
然后查询得到累计字段大于随机生成的第一条记录,根据这个id再去数据库查询这条记录
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
编号0:出现次数 985537
编号1:出现次数 948235
编号2:出现次数 788074
编号3:出现次数 140894
编号4:出现次数 92080
编号5:出现次数 45180编号6因为和目标分数一样了,已经不需要出现了,刚好Rnd函数可以避免这个出现
一个思路,我算法不好,LZ随便看看好了