上次问了一个出题的权重设计问题,还是有问题

hztltgg 2011-10-17 02:38:08
http://topic.csdn.net/u/20111011/09/072cf7a1-6235-428a-966f-4e1227197036.html

Order By (设定分数-当前分数) * 随机

如果设定的为1,10道题目初始为0,其中一题错误扣分后为-1
那就变成
2*随机和1*随机的排序了,2*随机出现的概率有一半了,变成了做错一题后不断的重复做这题,而不是我想要的11分之2的概率。
...全文
162 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyj052 2011-10-18
  • 打赏
  • 举报
回复
顶下!!!学习!!!!
风骑士之怒 2011-10-18
  • 打赏
  • 举报
回复
当 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随便看看好了
kevin87923 2011-10-18
  • 打赏
  • 举报
回复
学习下。 标记
风骑士之怒 2011-10-18
  • 打赏
  • 举报
回复

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
风骑士之怒 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hztltgg 的回复:]
我现在用一个很繁琐的方法

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

权重排序基础 加 随机概率分布?

处理起来好像是很麻烦

我也考虑加一个字段,根据其权重在总权重中的概率分布,如 -1 离 1 等于2的权重,然后其占有 2/6的概率,计算出该记录的是否命中概率,然后按照 这个字段 和权重字段倒序排列,不知道这样可不可以。

风骑士之怒 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hztltgg 的回复:]
刚才说错了,

我现在就是想让他们出现的概率分别是
2/6,1/6,1/6,1/6,1/6
[/Quote]
额,这个贴才看明白LZ要干嘛。。。
hztltgg 2011-10-18
  • 打赏
  • 举报
回复
我现在用一个很繁琐的方法

首先查询,得到一个 id 和 标准分-得分的差 的集合
然后遍历这个集合,增加一个累计字段,每个累计为前一个累计加本题的那个差值权重,第一题就不用加前面的累计了。
然后随机生成一个小于差值权重的合计
然后查询得到累计字段大于随机生成的第一条记录,根据这个id再去数据库查询这条记录
Arnuonly 2011-10-18
  • 打赏
  • 举报
回复
一道题重复出现的原因在于,你对权重的依赖性增强。如果放宽权重的依赖性,是否能够有效。
例如,前5题权重在0-5,后5题权重在5-10.题库里面有20道题,那么你就不会出现一道题重复出现的问题了。
Arnuonly 2011-10-18
  • 打赏
  • 举报
回复
你说的分,指的是题目的权重啊?
分析一下你说的,
最初,题目的权重都相等,出题概率也相等。
随着不断的做题,根据做错做对的次数,改变题目的权重,从而改变出题的概率,达到权重越小的,出题概率越高。
设某题权重为x,那么当他被选中并做题后,如果作对了,x=x+1,如果做错了,x=x-1.

然后题库中总题数为y。每次从y中选择一个题,选择的依据是权重越低的,概率越高。

那你需要的就是一个算法,可以根据权重分配来获得一个具体的权重值,然后根据这个值来随机获得对应权重的题目。
hztltgg 2011-10-18
  • 打赏
  • 举报
回复
刚才说错了,

我现在就是想让他们出现的概率分别是
2/6,1/6,1/6,1/6,1/6
hztltgg 2011-10-18
  • 打赏
  • 举报
回复
初始是0,错误一次扣一分就是-1,这个没有关系呀,初始时50,错误扣一分就是49

如果约定是到1分,初始是0,一共5题,现在做错一题,扣1分,分数情况是
-1,0,0,0,0
那么他们离约定的分数就是
2,1,1,1,1
我现在就是想让他们出现的概率分别是
2/6,1/5,1/5,1/5,1/5
如果按照离约定的分数来随机的话,出现的结果概率是2/3和1/12,1/12,1/12,1/12,这是错误的
freemangood 2011-10-18
  • 打赏
  • 举报
回复
好帖,标记一下,请分享最终的解决方案!
Arnuonly 2011-10-18
  • 打赏
  • 举报
回复
错误一题加0分嘛。
风骑士之怒 2011-10-18
  • 打赏
  • 举报
回复
其中一题错误扣分后为-1

为什么可以有这种情况出现
assky124 2011-10-18
  • 打赏
  • 举报
回复
增加一个字段出现次数,优先选出现次数少的
hztltgg 2011-10-18
  • 打赏
  • 举报
回复
问题是这样的

有一批题目,初始设置每题为50
做对一题加1分,做错一题减1分

现在想随机取题目,比如60分以下的题目,我可以以条件60以下,跳过随机生成的一个不大于记录条数的数来取。

但是这样取,没有分数权重的概念,结果是分数低的在后期不断的重复出现。
我想按照分数的权重,分数低的在前期就概率更大的出现,应该如何设计比较合适?

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧