我正在尝试设计一个执行以下操作的算法。
输入:
我有一组映射到属性集的键(总n)。属性包含每个属性的权重和属性的值。
输出:
根据属性集及其各自的权重和值,确定一组合格的密钥(总k)。
此外,在选择获胜者的每个周期中都应该对数据进行修改,以便未被选中的人的机会在下一个周期中上升(而获胜的人的机会就好像他们完全一样)新系统)。
希望手头的问题很清楚。基本上,财产的价值和相应的权重将决定哪些关键字更有可能获胜(权重更高的更高价值会增加关键获胜的概率),我们最终将最终选择所有人。
非常感谢有关如何做到这一点的任何输入。
谢谢! - Azeem
答案 0 :(得分:1)
将您的权重视为一条线的线段,总线长度等于权重之和。选择0到该长度之间的均匀随机数。获胜者是该数字所属的候选人。
删除该获胜者,并相应减少总行长。然后在剩下的候选人中重复此过程,直到您选择了k
。
在循环之后,将失败者重新缩放以占据原始长度的大部分,然后将获胜者加回来,剩余的小块将在他们之间平均分配。
答案 1 :(得分:0)
一种未经优化但有效的方法可以列出所有参赛者的名单,但附加额外的指数以确定最重要的比例。
psuedo完全脱离任何实际实现的背景,但你应该明白这一点。
const int DEFAULT_WEIGHT = 1;
public List<Contestant> items = new List<Contestant>();
public List<Guid> LotteryPool = new List<int>();
public Contestant Roll()
{
Random rnd = new Random();
rnd.Seed = DateTime.Now.Ticks;
// Generate LotteryPool
foreach(Contestant item in items)
{
for(int i = 0; i < item.Weight; i++)
{
LotteryPool.Add(item.Id);
}
item.Weight++;
}
// Find the contestant matching a random id from the pool.
Contestant result = FindContestant(LotteryPool[rnd.Next(0, LotterPool.Count]);
// apply the default weight the winner
result.Weight = DEFAULT_WEIGHT;
return result;
}