swift - 根据用户数 "likes"根据分布随机找一个用户

标签 swift random

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

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

但在我的例子中,我希望这个概率基于用户收到的“喜欢”的数量:用户获得的“喜欢”越多,最有可能选择这个用户。 我知道 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/

相关文章:

ios - 当通过 contentOfURL 同步下载图像时开始动画 UIActivityIndi​​cator

ios - UIDatePicker 和不同时间的两个按钮

c++ - 反转 int 中 n 个不同的随机位

c - 为什么我的 C 代码只生成每三个随机数?

使用 Turtle 生成 Python 随机颜色

java - 查找/打印在找到随机数之前生成了多少个数字

swift - 有人会如何观察 AVPlayerLayer 的 videoRect 变化?

ios - 以编程方式调用已设置的 UIBarButtonItem 操作

ios - UIBarButtonItem 的空间问题

algorithm - 将一个小数字散列为一个随机的 64 位整数