根据用户“喜欢”

时间:2018-02-22 09:48:08

标签: swift random

我正在尝试找到从用户表中随机选择用户的最有效方法。

如果预期的分布是统一的,那么这将是非常容易的:每个用户的概率相同。

但在我的情况下,我希望这个概率基于用户收到的“喜欢”的数量:用户获得的“喜欢”越多,最有可能选择此用户。 我知道GameKit提供了一个类GKGaussianDistribution来生成高斯分布后的随机数,但我不认为这符合我的需要。

另一种方法是为每个用户的每个“喜欢”填充一个唯一ID的数组,并选择其中一个arc4random_uniform(),然后查找其所有者用户,但我'我不确定这是最有效的方法。

我想这是我们许多人一生中必须解决的常见问题?

1 个答案:

答案 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的下限进行优化。