Так вроде свояли же уже достаточно быстрый генератор)
Осталось сравнить с какой-нить другой реализацией: Пример теста:
C++ (Qt)
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <iterator>
template <unsigned long N>
class URandGen
{
public:
typedef unsigned long size_type;
URandGen() {
m_arr = new int[N];
for (size_type i = 0; i < N; ++i)
m_arr[i] = i;
reset();
m_index = 0;
}
~URandGen() {
delete []m_arr;
}
void reset() {
for (size_type i = 0; i < N; ++i) {
std::swap(m_arr[i], m_arr[rand()%N]);
}
}
int operator()() {
if (m_index == N) {
reset();
m_index = 0;
}
return m_arr[m_index++];
}
private:
int *m_arr;
size_type m_index;
};
int main()
{
srand(time(0));
const int N = 1000000;
int *arr = new int[N];
URandGen<N> randGen;
clock_t start = clock();
std::generate(arr, arr+N, randGen);
std::cout << "time = " << float(clock()-start)/CLOCKS_PER_SEC << " sec" << std::endl;
//std::copy(arr, arr+N, std::ostream_iterator<int>(std::cout, " "));
std::cin.get();
return 0;
}
Осталось подставить вместо URandGen другую реализацию и всё станет ясно)
Хотя сделать что-то быстрее будет ооочень не просто)