#include <iostream>
#include <vector>
#include <algorithm>
#include <random>

typedef std::vector<std::size_t> Vec;

Vec MakeData(std::size_t N){
	Vec V(N);
	std::size_t i = 0;

	for (auto& o : V) o = i++;

	return V;

}

bool BlockMove(Vec& vec, std::size_t P, std::size_t Len){
	P = std::min(P, vec.size());
	Len = std::min(Len, vec.size()-P);

	Vec T;

	for (size_t i = P; i < P+Len; i++) T.push_back(vec[i]);
	for (size_t i = 0; i < P; i++) T.push_back(vec[i]);	
	for (size_t i = P+Len; i < vec.size(); i++) T.push_back(vec[i]);

	vec = T;

	return true;

}

bool HandShuffle(Vec& vec){
	std::random_device rd;
	std::mt19937 mt(rd());
	//std::mt19937 mt(0);
	std::uniform_int_distribution<int> uid(2, 8);

	int P = 0;
	int Len = vec.size();
		
	while (Len > 0){
		P += uid(mt);
		Len -= uid(mt);

		Len = std::max(Len, 0);
		P = std::min<int>(P, vec.size() - Len);

		BlockMove(vec, P, Len);
	}

	return true;
}

bool MakeHoge(Vec& vec,std::size_t N){

	for (size_t i = 0; i < N; i++)
	{
		HandShuffle(vec);
	}

	return true;
}

bool Show(Vec vec){
	std::cout << "Result:";
	for (auto& o : vec) std::cout << o << ',';
	std::cout << std::endl;

	return true;
}

int main(){
	Vec vec = MakeData(53);
	MakeHoge(vec, 5);
	Show(vec);
	std::cout << std::endl;
	std::sort(vec.begin(), vec.end());//デバッグ用
	Show(vec);

	return 0;
}