Russian Qt Forum
Ноябрь 23, 2024, 05:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Random в Qt  (Прочитано 40265 раз)
V1KT0P
Гость
« Ответ #30 : Май 09, 2012, 15:13 »

Т.е. чтобы получить 1 случайное число смувили в среднем 5 тысяч int, перекачали 20k байт. Что Вы можете сказать о технике и классе программиста предложившего такое решение?  Улыбающийся
Ну так приведи код которые делает это лучше, быстрее, требует памяти памяти. Но с условием что вероятность выпадения всех последовательностей одинакова, и алгоритм обеспечивает появление всех комбинаций. Вот когда покажешь тогда и послушаю.
Но только не оптимизируй тот тупой алгоритм, я и так знаю что там можно очень сильно оптимизировать. Например можно устранить тасовку памяти используя связный список, при чем введя кое-какие оптимизации поиск по связному списку можно очень сильно сократить за счет увеличения потребления памяти на несколько процентов.
Предложи свой алгоритм который не уступает по свойствам тупому =).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Май 09, 2012, 15:40 »

Предложи свой алгоритм который не уступает по свойствам тупому =).
"Свой" здесь неуместно, все это вещи известные. Как достичь "той же тупизны" уже дважды приводилось (в постах #16 и #25). Ладно, еще раз
Код
C++ (Qt)
for (int i = 0; i < numSel; ++i)
qSwap(data[i], data[qrand() % data.size()]);
 
// первые numSel элементов - подвыборка
 
Вы уж сравните с Вашим по скорости  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #32 : Май 09, 2012, 15:43 »

Так вроде свояли же уже достаточно быстрый генератор)

Осталось сравнить с какой-нить другой реализацией: Пример теста:
Код
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 другую реализацию и всё станет ясно)
Хотя сделать что-то быстрее будет ооочень не просто)  
« Последнее редактирование: Май 09, 2012, 15:46 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
V1KT0P
Гость
« Ответ #33 : Май 09, 2012, 15:54 »

Вы уж сравните с Вашим по скорости  Улыбающийся
Так вроде свояли же уже достаточно быстрый генератор)
Да действительно, мне такое почему-то в голову не пришло =(. Хотя вариант на полиномах выиграет по занимаемой памяти(ему там вообще мизер нужен) =).
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 22.