随机生成[0,n)中不重复的m个数。

 class Random {
public:
Random(int n, int m):n(n), m(m) {}
void generate() {
srand(time(NULL));
for (int i = ; i < n; ++i) data.push_back(i);
for (int i = ; i < m; ++i) swap(data[i], data[i + rand() % (n - i)]);
} void increase() {
data.push_back(n++);
int i = rand() % n;
swap(data[i], data[n - ]);
} void print() const {
for (int i = ; i < m; ++i)
cout << data[i] << " ";
cout << endl;
}
private:
int n;
int m;
vector<int> data;
};

Line 7, 第i个元素会和第从[i, n)中找一个元素交换。可以证明每个数被选择在第k个位置上的概念为1/n。被选择的概念为m/n。

比如0被放在data[1]这个位置的概率,等于0没有被放在第一个位置的概率*0放在第二个位置的概率,也就是(1-1/n)*1/(n-1)=1/n。

依此类似。

最终前m个数就是不重复随机数。

如果data是不断递增的,也就是newN = n + 1,怎么随机选择k个数? 只要将data[newN - 1]和前面的数随机交换就可以了,O(1)的更新。

对于第newN个数,它被选上的概率是1/newN.

其他数被选上的概率 =(它之前被选在m个数里面的概率)*(它在newN下没有被交换出这m个数的概率)

=(它之前被选在m个数里面的概率)*(第newN个数和其他数交换的概率)=(1/n)*(n/newN)=1/newN。

Select a random number from stream, with O(1) space

Given a stream of numbers, generate a random number from the stream. You are allowed to use only O(1) space and the input is in the form of stream, so can’t store the previously seen numbers.

So how do we generate a random number from the whole stream such that the probability of picking any number is 1/n. with O(1) extra space? This problem is a variation of Reservoir Sampling. Here the value of k is 1.

看完geeksforgeeks上面的解释。

重写了一遍。

     void increase() {
data.push_back(n++);
int i = rand() % n;
//swap(data[i], data[n - 1]);
if (i < m) data[i] = data[n - ];
}

最新文章

  1. iOS - 使用自定义字体-苹方字体
  2. jquery实现on/off开关按钮
  3. vim没有颜色
  4. BZOJ3547 : [ONTAK2010]Matchings
  5. Github 与Git pages
  6. struts 2.0部署
  7. php提高程序效率的24个小技巧
  8. Codeforces Round #181 (Div. 2) C. Beautiful Numbers 排列组合 暴力
  9. javaweb学习总结二(静态导入、自动拆装箱、增强for与可变参数)
  10. this 函数内部属性
  11. Object之克隆对象clone 和__clone()函数
  12. floor() 和 ceil()函数
  13. MySql存储引擎介绍
  14. HTML界面多语言切换
  15. node开发备注
  16. hdu5592 倒序求排列+权值线段树
  17. UOJ #36「清华集训2014」玛里苟斯
  18. CSS实现16:9等比例盒子
  19. Flask框架(2)-JinJa2模板
  20. 配置完centos 6以后,大概需要安装的软件(主要是yum)

热门文章

  1. 最近使用Nginx的一点新得
  2. Diycode开源项目 NotificationActivity
  3. 【Unique Paths II】cpp
  4. Oracle 分析函数--Row_Number()
  5. Aptana Studion出现 duplicate location重复定位报错
  6. 从xml文件中绑定数据到DropDownList控件上
  7. schema.xml属性概念
  8. java 获取请求的完整url地址
  9. [BZOJ2456] mode(一道很有意思的题)
  10. LoadRunner中请求HTTPS页面。