求教:计算重复率的公式或算法
有题目ID列表:a b c d
每次随机抽取3道题目,共抽了5次:
第1次:b a c
第2次:c b d
第3次:d b a
第4次:c a d
第5次:b d a
统计:
a出现4次
b出现4次
c出现3次
d出现4次
求:计算重复率的公式或算法
------解决方案--------------------using System;
using System.Collections.Generic;
using System.Text;
namespace Creator
{
public class TestPaperCreator
{
public static void Main()
{
new TestPaperCreator().Create(5, 3);
}
/// <summary>
/// 出题
/// </summary>
/// <param name= "pageKind "> 出题的套数 </param>
/// <param name= "problemNumber "> 每套题的题目数 </param>
public void Create(int pageKind,int problemNumber)
{
ItemLib lib = new ItemLib();
//每套题目数不能大于题库的总数
if (problemNumber > lib.Items.Count)
return;
Random rd = new Random();
for (int i = 0; i < pageKind; i++)
{
Console.WriteLine( "------------------------------------------- "+i.ToString()+ "--Start-- ");
List <Item> tempLib = new List <Item> ();
tempLib.AddRange(lib.Items);
//出现次数增加那么被选中的概率就会减少
for (int j = 0; j < problemNumber; j++)
{
int sumTimes = 0;
foreach (Item item in tempLib)
{
sumTimes += item.Times;
}
//获得选择依据
int selectKey = rd.Next(sumTimes*(tempLib.Count-1));
int value = 0;
Item selectItem = null;
foreach(Item item in tempLib)
{
value += sumTimes - item.Times;
if (selectKey <= value)
{
selectItem = item;
break;
}
}
//次数加1
selectItem.Times++;
tempLib.Remove(selectItem);
Console.WriteLine( "title: " + selectItem.Name + " Content: " + selectItem.Content);
}
Console.WriteLine();
}
Console.WriteLine( "--------------------------------------------Summary-- ");
foreach (Item item in lib.Items)
{
int occurTimes = item.Times-1;
Console.WriteLine( "title: " + item.Name + " Occur Times: " + occurTimes.ToString());
}
}
}
/// <summary>
/// 题库
/// </summary>
public class ItemLib
{
private List <Item> m_Items = new List <Item> ();
public List <Item> Items
{
get { return m_Items; }
set { m_Items = value; }
}
public ItemLib()
{
//you can get data form library
m_Items.Add(new Item( "A ", "1+1=? "));