当前位置: 首页 > 面试题库 >

从分布不均匀的集合中选择随机元素?

李博达
2023-03-14
问题内容

我想要一个集合,并且其元素具有与之关联的概率,因此当我从集合中随机选择一个元素时,分布遵循与元素关联的概率。我想在一个非常小的Java应用程序中使用它,该应用程序存储了我要观看的电影列表,因此我可以向我推荐一部随机电影(否则我总是要花几个小时才能挑选一部电影)。对于每部电影,我都希望将向其推荐电影的次数与该电影的推荐次数成反比,该次数与从该列表中为下一个建议中挑选电影的可能性成反比。

是否存在一种数据结构,可以从中随机挑选分布不均匀的元素?

如果没有,那么编写这种数据结构的最有效方法是什么?当然,我总是可以构建一个数组,将列表中的每个元素足够频繁地放入数组中,以便数组中值的分布与我希望它们具有的概率匹配,然后从该数组中选择一个随机元素;但是对于大型电影而言,效率将非常低下。我的另一个想法是封装元素以及所有元素的概率之和(因此第一个元素将被封装为(first,p(first)),第二个元素被封装为(second,p(second)+
p(首先)),等等),然后选择一个介于0和1之间的随机数,然后对这些封装元素的排序列表进行二进制搜索。听起来合理吗?

TL:DR(有点抽象):如何在Java中高效地将非均匀分布映射到集合的元素?


问题答案:

不确定我是否理解正确的问题。我会用一个TreeMap<Double, Movie>

示例:假设您有电影A(60%),电影B(30%)和电影C(10%)。

TreeMap<Double, Movie> movies = new TreeMap<>();
movies.put(0.6, new Movie("Movie A"));
movies.put(0.9, new Movie("Movie B")); // 0.6 + 0.3
movies.put(1.0, new Movie("Movie C")); // 0.6 + 0.3 + 0.1
Double probability = Math.random(); // between 0 (inclusive) and 1.0 (exclusive)
Movie chosen = movies.higherEntry(probability).getValue();

我将把人口和概率的重新安排留给您。



 类似资料:
  • 问题内容: 我知道如果我使用Java的Random生成器,并使用nextInt生成数字,则数字将均匀分布。但是,如果我使用2个Random实例,并使用两个Random类生成数字,会发生什么。数字是否会均匀分布? 问题答案: 每个实例生成的数字将均匀分布,因此,如果将两个实例生成的随机数序列组合在一起,则它们也应均匀分布。 请注意,即使结果分布是均匀的,您也可能要注意种子,以避免两个生成器的输出之间

  • 问题内容: 我试图识别/创建一个函数(在Java中),该函数给我一个非均匀的分布式数字序列。如果我有一个函数说它将给我一个从到的随机数。 该函数最适合任何给定的函数,下面仅是我想要的示例。 但是,如果我们说函数将返回来自分布式的s nonuni。 我想例如说 约占所有案件的20%。 大约是所有情况的50%。 约占所有案件的20%。 大约是所有情况的10。 总之somting,给我一个数字,如正态分

  • 我试图把一些代码,将做同样的Python, Numpy.random.选择 关键部分是: 与a中的每个条目相关的概率。如果没有给定,则样本假定a中所有条目的均匀分布。 一些测试代码: 这将产生以下输出: 有时候。 这里有一个分布,它是部分随机的,但也有结构。 我想在C#中实现这一点,老实说,我不确定是否有有效的方法来实现。 大约4年前,有一个很好的问题被提出:模仿Python的随机性。选择。网 因

  • 我知道有人问过类似的问题,比如 从包含n个元素的向量中随机选择m个元素 从未知长度的序列中随机选择N个项目 但我越看越困惑。 从N个元素中均匀随机地选择M个元素 所以我需要从N个元素中选择M个元素。我还需要使被选中的概率均匀分布于每个元素: 我的直觉是 随机选择一个元素 把它拿出来 对其余元素重复此过程 我猜这个解决方案错了?所选元素的概率为,<代码>1/(N-M),而不是,对吗? 一个可能的正确

  • 0.1-0.2:********** 0.2-0.3:******** 0.3-0.4:********* 0.5-0.6:********* 0.6-0.7:********* 0.7-0.8:********* 0.4-0.5:********* 0.5-0.6:********* 0.6-0.7:********* 0.1-0.2:********* 0.2-0.3:********* 0.

  • 我试图找到一种有效的算法来生成一个给定节点数的简单连通图。类似于: