学前端有必要找培训机构吗/汕头搜索引擎优化服务
- 题目:从1-N的数字里选出M个数字组成一个数组,要求每个数字在每个位置的期望相同
1.洗牌算法思想
//1.思路为借助洗牌算法的完全随机性,选其中的M形成数组
vector<int> NewArray(int n, int m)
{if (n < m)return vector<int>();vector<int> base(n);for (int i = 1; i <= n; i++)base[i - 1] = i;//以下为著名的Knuth-Durstenfeld Shuffle 洗牌算法,注意取余为%(i+1)for (int i = n - 1; i >= n - m; i--){srand((unsigned)time(NULL));swap(base[i], base[rand() % (i + 1)]);}vector<int> save(m);for (int i = n - m, j = 0; i <= n - 1; i++, j++)save[j] = base[i];return save;
}