ランダムで繰り返さない乱数を生成します.

808 ワード

template
/**@ state:
   void random(T* array,size_t begin,size_t end){}
   this func generate a random no-repeat list between begin number and end number.
   T* array: a array with type T, including int, size_t,..
*/
void random(T* array,size_t begin,size_t end) {
	srand(unsigned(time(NULL)));
	if (begin >= end) std::cerr << "begin <= end!";
	size_t length = end - begin + 1;
	//1.initialization: assigment
	for (size_t i = 0; i < length; ++i)
	{
		array[i] = i + begin;
	}
	//2. generate random numbers
	for (size_t i = length -1; i >= 1; --i)
	{
		swap(array[i], array[rand() % i]);
	}
}
区間[begin,end]でランダムに繰り返さない乱数列を生成し、長さはlength=end-begin+1です.
アルゴリズム解析:
      アルゴリズムの複雑さは θ(length)=θ(n)
      空間の複雑さは θ(length)=θ(n)