无放回采样算法实验报告
实现无放回采样算法。输入为一个数组和正整数k,算法对数组进行操作,前k位为采样结果。
1. 算法基本思路
无放回采样,即从给定的数组中随机选择指定数量的元素,且每个元素只能被选中一次。算法基本思路如下:
- 从给定的数组中随机选择一个元素,将其加入采样结果集
- 将选中的元素从数组中移除,确保每次采样不会重复选择同一个元素
- 重复上述步骤,直到达到指定的采样数量或者数组中的元素被全部采样完毕
2. 算法正确性证明
通过在每次迭代中随机选择数组中的一个元素,并将其从数组中移除,确保了每个元素被选择的概率相等,且每个元素只会被选择一次。因此,该算法实现了无放回采样,保证了采样结果的随机性和唯一性。
3. 算法时间复杂度
根据移动数组中元素的情况,总体为 O ( n ) O(n) O(n)
4. 代码设计基本框架
//无放回采样实现
vector<int> Knuth_shuffle(vector<int>& A, int k) {
vector<int> sampledNumbers;
srand(time(0)); // 设置种子
for (int i = 0; i < k; ++i) {
if (A.empty()) // 如果数组为空,则结束采样
break;
int randomIndex = rand() % A.size(); // 生成随机索引
sampledNumbers.push_back(A[randomIndex]); // 将选中的数字放入采样结果中
A.erase(A.begin() + randomIndex); // 从数组中移除选中的数字
}
return sampledNumbers;
}
- 程序入口为
main()
函数,首先读取用户输入的数组和采样数量。 - 使用
Knuth_shuffle()
函数进行无放回采样,将采样结果输出。 - 代码利用向量
vector
存储数组和采样结果,使用了 C++ 标准库中的随机数生成函数rand()
以及数组操作函数erase()
。