[编程珠玑读书笔记]抽样问题

问题定义:从n个数中,等概率的抽取m个数。

真心觉得自己概率论学得不咋第。第一个和第三个函数还是没有看懂。

#include <iostream> #include <algorithm> #include <set> #include <stdlib.h> using namespace std; void genknuth( int m, int n) { srand(5); for( int i = 0; i < n; i++) if( (rand() % (n - i) < m)) { cout << i << "\n"; m--; } } void gensets( int m, int n) { set<int> s; while( s.size() < m) s.insert( rand() % n); set<int>::iterator i; for( i = s.begin(); i != s.end(); i++) cout << *i << endl; } /* 习题9: 当m接近n时,基于集合的算法会产生很多集合中早就存在的整数,因此需要去掉这些整数。写出一个算法,即便在最坏情况下,该算法也只需要m个随机数值? */ void genfloyd( int m, int n) { set<int> s; set<int>::iterator i; for(int j = n - m; j < n; j++) { int t = rand() % ( j + 1); if( s.find(t) == s.end()) s.insert(t); else s.insert(j); } for( i = s.begin(); i != s.end(); i++) cout << *i << "\n"; } void getshuf( int m, int n) { int i, j; int *x = new int[n]; for( i = 0; i < n; i++) x[i] = i; for( i = 0; i < m; i++) { j = (rand() %( n - 1- i)) + i; int temp = x[i]; x[i] = x[j]; x[j] = temp; } sort( x, x+m); for( i = 0; i < m; i++) cout << x[i] << "\n"; } int main(int argc, char* argv[]) { cout << "genknuth: " << endl; genknuth( 5, 10); cout << "gensets:" << endl; gensets( 5, 10); cout << "getshuf:" << endl; getshuf( 5, 10); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值