随机选取无重复元素子集合,我写了几种算法的证明,这些证明有没有错误呢( 二 )

随机选取无重复元素子集合,我写了几种算法的证明,这些证明有没有错误呢
的概率从除了第一个元素以外剩下的元素中抽取m个元素。证明过程也没有什么问题。算法四:这真是一个神奇的算法,而且证明过程的思路也很巧妙,直接计算被抽到的概率比较困难,于是从反面(不被抽到的概率)进行计算和证明,证明过程和计算上是没有问题的。综合多次的结果来看,算法四应该是表现最好的算法,时间复杂度从理论和实践上都是最佳的,算法三个某些实验中会出现和算法四消耗时间非常接近甚至略快的情况,而算法二的性能稳定最差。另外,算法二的方差也表现得比较不稳定,有时是最低的,有时又是最高的。最后再次感谢题主@李琴 分享了几个精彩的算法和文章。
■网友
要是我自己遇到这个问题,我就直接用random_shuffle()了// random_shuffle example#include \u0026lt;iostream\u0026gt; // std::cout#include \u0026lt;algorithm\u0026gt; // std::random_shuffle#include \u0026lt;vector\u0026gt; // std::vector#include \u0026lt;ctime\u0026gt; // std::time#include \u0026lt;cstdlib\u0026gt; // std::rand, std::srand// random generator function:int myrandom (int i) { return std::rand()%i;}int main () { std::srand ( unsigned ( std::time(0) ) ); std::vector\u0026lt;int\u0026gt; myvector; // set some values: for (int i=1; i\u0026lt;10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9 // using built-in random generator: std::random_shuffle ( myvector.begin(), myvector.end() ); // using myrandom: std::random_shuffle ( myvector.begin(), myvector.end(), myrandom); // print out content: std::cout \u0026lt;\u0026lt; "myvector contains:"; for (std::vector\u0026lt;int\u0026gt;::iterator it=myvector.begin(); it!=myvector.end(); ++it) std::cout \u0026lt;\u0026lt; \u0026#39; \u0026#39; \u0026lt;\u0026lt; *it; std::cout \u0026lt;\u0026lt; \u0026#39;\\u0026#39;; return 0;}


推荐阅读