C++洗牌算法

void shuffle(vector<int>& v){
    int n = v.size()-1;
    while(n){
    	//从下标[0,n]中随机挑选一个数,和v[n]交换(注意包括v[n]自己)
        int k = rand()%(n+1);
        swap(v[k],v[n]);
        --n;
    }
}

为什么下标随机数是[0,n]而不是[0,v.size()-1]呢?
因为前者能够保证每个数字都被选中1次,
而后者是每个数字被选中的数学期望是1次,然而实际上有的数字被选中了2、3、4、5次等,而有的数字被选中了0次,这是不公平的!

发布了138 篇原创文章 · 获赞 26 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a13602955218/article/details/105321304