ランダムで繰り返さない乱数を生成します.
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)