110,529
社区成员
发帖
与我相关
我的任务
分享
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;
}
}