随机选择加权项目

时间:2016-08-05 02:49:03

标签: arrays sorting activerecord random

我的模型TicketBuyer列包括ticket_buyer名称和购买的number_of_tickets。我想随机选择一张中奖彩票。我认为我的偏好是创建另一个模型(SelectTable),其中ticket_buyer名称复制的行数等于购买的number_of_tickets,从而赋予每条记录相同的权重。然后我可以运行一个简单的排序并选择新表中的第一条记录。我无法为每个ticket_buyer自动创建具有正确行数的表。当然,也可以采用更有说服力/更有效的方式来做到这一点。建议非常感谢。

1 个答案:

答案 0 :(得分:1)

如果速度不是问题,您可以在不创建任何额外数据结构的情况下完成。

  • 查找任何人购买的最大number_of_tickets
  • 随机选择门票买家
  • 做另一次抽奖,使用number_of_tickets / max_number_of_tickets成为赢家的机会
  • 如果他们未通过第二次抽奖,则随机选择另一个购票者并重复此过程直至有人获胜

除非有一些疯狂的分发,比如一个人购买一百万张门票而其他人都买一张,这不应该花太长时间。

的伪代码:

 max_tickets = max(table:number_of_tickets)
 while true do:
     // select a random buyer
     buyer = select random row from table

     // assume random(n) returns an integer number from 0 to n - 1 inclusive:
     if random(max_tickets) < buyer.number_of_tickets then
          return buyer   // we have a winner
 end