我正在尝试找到从用户表中随机选择用户的最有效方法。
如果预期的分布是统一的,那么这将是非常容易的:每个用户的概率相同。
但在我的情况下,我希望这个概率基于用户收到的“喜欢”的数量:用户获得的“喜欢”越多,最有可能选择此用户。
我知道GameKit提供了一个类GKGaussianDistribution
来生成高斯分布后的随机数,但我不认为这符合我的需要。
另一种方法是为每个用户的每个“喜欢”填充一个唯一ID的数组,并选择其中一个arc4random_uniform()
,然后查找其所有者用户,但我'我不确定这是最有效的方法。
我想这是我们许多人一生中必须解决的常见问题?
答案 0 :(得分:1)
一种解决方案是使用轮盘赌算法。它与您对一系列唯一ID的想法基本相同,但更好地针对空间进行了优化(不过时间)。
以下是它的工作原理:
为每个用户分配一个范围,如下所示
var totalLikes = 0
for user in users
{
user.likeRange = totalLikes ..< (totalLikes + user.likes)
totalLikes += user.likes
}
使用随机数生成器选择范围0 ..< totalLikes
在数组中查找随机数属于用户likeRange
let selectedUser = users.find { $0.likeRange.contains(randonNumber) }
这将是线性搜索,但您可以使用二进制搜索根据每个用户likeRange
的下限进行优化。