我正在尝试找到从我的用户表中随机选择用户的最有效方法。
如果预期分布是均匀的,这将非常容易:每个用户的概率相同。
但在我的例子中,我希望这个概率基于用户收到的“喜欢”的数量:用户获得的“喜欢”越多,最有可能选择这个用户。
我知道 GameKit 提供了一个类 GKGaussianDistribution
来生成遵循高斯分布的随机数,但我认为这不能满足我的需要。
另一种方法是为每个用户的每个“喜欢”填充一个具有唯一 ID 的数组,并使用 arc4random_uniform()
选择其中一个,然后查找其所有者用户,但我不确定这是最有效的方式。
我想这是我们许多人一生中必须解决一次的常见问题?
最佳答案
一种解决方案是使用轮盘赌算法。它与您对唯一 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
.
关于swift - 根据用户数 "likes"根据分布随机找一个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48924200/