抽牌算法

前几天写了一个功能,大致要求如下:

        给怪物增加一个接口,可以在玩家们打死这个怪物的时候每个玩家获得X个物品(最多N个玩家),如果参与击杀的玩家数目大于N个的话,就将这N×X个物品评分给参与击杀的所有玩家。

         有一个问题就是:如果Y个玩家参与击杀(Y>X)并且 X×N%Y != 0 那么就把余出来的随机分配给这Y个玩家。

         在写这个功能的时候,一开始是参考了之前同事写的代码,他们的办法是用一个SET来保存已经被选中的玩家,然后一直随机,随机选出了X×N%Y个玩家为止,再将剩余的物品给这些玩家每人添加一个就好了。

         虽然这样写可以完成这个功能,但是如果玩家数目比较多,需要随机的数目比较多,那么也许就需要很久的时间,才能随机满(比如说随机函数一直随机到了已经被选中的玩家)。

         于是想了一下,想到一个快速,安全的解决方法:

         在vector中保存当前的玩家,然后假设需要被随机的玩家个数为N,随机一个0~N-1 的值random,选出random号玩家,再将random号玩家与N-1号玩家交换位置,

这样每次只需要处理最后一个玩家。最后再--N。

        这样处理的目的应该显而易见,就是将选出来的玩家独立在外,使得之后随机挑选的时候不会重复挑选他,就可以在线性时间内随机选择出所有被选中的玩家。

        虽然很简单,但是高效。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值