algorithm - 从具有均匀分布概率的流中选择一个元素

标签 algorithm random

给你:

  1. 一个流(流的结尾是EOF)
  2. 函数 next()获取流中的下一个元素并推进流中的指针
  3. 随机生成器生成介于 0 和 1(含)之间的 float

输出:

  • 被证明是随机(均匀分布)选择的元素

您可以使用一个或两个变量。

你不能使用数组/列表,你不能告诉trying to get all elements out and store them all and then pick的方式.


这是一道面试题。

我的想法是:

  1. 我使用变量 cur存储最近保留的元素
  2. 所以,如果我得到一个新元素,我会使用生成器生成一个随机的 0 或 1,如果它是 0,那么 cur = new element ;否则,继续;
  3. 如果我得到 EOF,则返回 cur

我的想法对吗?如何证明?


同样的问题

How would you pick a uniform random element in linked list with unknown length?

最佳答案

设当前元素的索引为i

选择“记住”当前元素的概率为 1/i。当到达 EOF 时,生成你记得的元素。

最后,对于索引为 i 的每个元素,都有一个被选中的概率:

enter image description here

可以按照这些准则使用归纳法进行正式证明。

关于algorithm - 从具有均匀分布概率的流中选择一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23351918/

相关文章:

excel - 对 n 个随机数求和(用于模拟目的)

go - 来自 crypto/rand 的随机 64 位整数

python - 创建 100 个随机整数的列表,返回最大值

java - 获取分配奖java的动态比率

python - 在 OpenCV 中填充圆圈

c++ - 使用 O(1) 元素访问在 Haskell 中实现高效的类似 zipper 的数据结构

c - 在 C 中生成正态分布随机数的最佳方法是什么?

ios - 显示随机启动画面

c - 难以理解 void 数组并在函数调用中使用它们

arrays - 切杆利润最大化算法