C++产生随机序列算法

如果急于知道如何实现,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放在函数外面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值