如果急于知道如何实现,C++中可以方便的调用 random_shuffle 函数,用例如下:
#include <vector> // vector
#include <algorithm> // random_shuffle
#include <ctime> // time
using namespace std;
int main() {
srand(time(0));
vector<int> vec;
vec.push_back(1); vec.push_back(2);
vec.push_back(5); vec.push_back(8);
// 产生[vec.begin(), vec.end())之间的随机序列,前闭后开
random_shuffle(vec.begin(), vec.end());
}
产生随机序列的思路是先从数组中随机选择一个数,放在某个位置,再从剩下的数中随机选择一个数,放在另一个位置,以此类推。可以证明,这样产生的序列是随机的,即每个数在每个位置出现的概率为 1 / n,n为随机序列的元素数目。为了便于从剩下未处理的数中随机取数,我们每次选取一个数后都放在未处理的数后面。
C++代码:
// 对[vec[low], vec[high]]之间的数据随机排列,双闭
void BuildRandSeq(vector<int> &vec, int low, int high) {
assert(low >= 0); assert(high < (int)vec.size()); assert(low <= high); // 检查合法性
srand(time(NULL)); // 设置seed
int rd, tmp;
/*从后向前生成随机序列*/
for (int i = high; i >= low; i--) {
rd = low + rand() % (i-low+1); // 从剩余的坐标中随机选取一个坐标
tmp = vec[rd]; // 交换该坐标对应的值与i坐标对应的值
vec[rd] = vec[i];
vec[i] = tmp;
}
}
注意:多次调用时请将设置seed放在函数外面。