STL应用之随机化全排列

本文介绍了随机序列生成算法的基本原理及其在不同场景的应用。通过示例代码演示了如何使用泛型编程技术实现序列随机化,并详细解释了算法背后的概率论依据。重点探讨了序列随机化的通用方法和具体实现细节,旨在为读者提供一个全面理解随机序列生成过程的知识框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入:一个序列,可以是一组数字,如1,2,3,4....,也可以是一组字符串"111","222",....

输出:原序列的随机化序列

要求:每种随机的序列出现的概率相等,如输入{1,2,3},那么有6种随机化序列,要求输出一种即可,但每种随机序列输出的概率是六分之一

 

主要方法:

对于{1,2,3},先将3固定,交换1,2,有{1,2,3},{2,1,3},再将每组的3与这组数据任意一个交换,最终可得六种序列,根据概率乘法公式,每种

序列出现的概率是六分之一

对于{1,2,3,4},将4固定,前面的{1,2,3}已经随机化6种序列,那么按照前面的方法,将4与每组所有数据交换,最终可得24种随机序列,每种

序列出现的概率是二十四分之一。

其余类推

 

编程需要考虑程序的通用性,采用泛型编程技术

 

代码:

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <Iterator>
	

using namespace std;
const int n=10;

template<class Iterator>
void Myrandom_shuffle(Iterator beg,Iterator end) {
	Iterator it;
	srand(unsigned(time(0)));
	int diff;
    Iterator swp;

	for(it=beg+1;it!=end;it++) {
		diff=rand()%(it-beg+1);
		swp=beg+diff;
		swap(*it,*swp);
	}
}

typedef int Type;

template<class Iterator>
inline static void Output(Iterator beg,Iterator end) {
	copy(beg,end,ostream_iterator<Type>(cout," "));
}

void main() {
	vector<Type>v;
	int i;
	cout<<"Written by Wangzhicheng "<<endl;
	cout<<"原先序列:"<<endl;
	for(i=0;i<n;i++) {
		v.push_back(i+1);
	}
	Output(v.begin(),v.end());
	cout<<endl;
	Myrandom_shuffle(v.begin(),v.end());
	cout<<"混洗后的序列:"<<endl;
	Output(v.begin(),v.end());
	cout<<endl;
}


测试:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值