实际开发过程中,可能会遇到这样的需求:在0到x范围内,生成n(n < x)个不重复的随机数。
这里给出一个简单的实现,其实就是以空间换时间的。
定义长x的数组,对这个数组采用洗牌法打乱顺序,然后顺序的取前n个。
Rand()一下则为重新洗牌。
TRandPool.h
#ifndef _TRandPool_h_
#define _TRandPool_h_
#include <windows.h>
#include <time.h>
#include "TArray.h"
template <int size>
class TRandPool
{
public:
TRandPool();
void Rand();
int operator[] (int index);
unsigned int Capacity();
virtual ~TRandPool();
private:
TArray1<int, size> m_array;
};
#include "TRandPool.hpp"
#endif
TRandPool.hpp
#ifndef _TRandPool_hpp_
#define _TRandPool_hpp_
template <int size>
TRandPool<size>::TRandPool()
{
for(int i = 0; i < size; i++)
{
m_array[i] = i;
}
srand((unsigned)time(NULL));
}
template <int size>
TRandPool<size>::~TRandPool()
{
}
template <int size>
void TRandPool<size>::Rand()
{
for (int i = 0; i < size; i++)
{
int randindex = rand() % size;
int temp = m_array[randindex];
m_array[randindex] = m_array[i];
m_array[i] = temp;
}
}
template <int size>
int TRandPool<size>::operator[] (int index)
{
return m_array[index];
}
template <int size>
unsigned int TRandPool<size>::Capacity()
{
return m_array.GetLen();
}
#endif