前几天写了一个功能,大致要求如下:
给怪物增加一个接口,可以在玩家们打死这个怪物的时候每个玩家获得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。
这样处理的目的应该显而易见,就是将选出来的玩家独立在外,使得之后随机挑选的时候不会重复挑选他,就可以在线性时间内随机选择出所有被选中的玩家。
虽然很简单,但是高效。