C++产生随机序列算法

如果急于知道如何实现,C++中可以方便的调用 random_shuffle 函数,用例如下:

#include 	// vector
#include 	// random_shuffle
#include 	// time

using namespace std;

int main() {
  srand(time(0));
  vector 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 &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放在函数外面。

你可能感兴趣的:(算法,C++)