crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> рандом
eldar85
  опции профиля:
сообщение 15.7.2010, 15:36
Сообщение #1


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


пользуюсь рандомом такого вида
qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()));
   int rand = qrand()%9000+1000;

но если его запускать в цикле то получается слишком много повторов одного и того же числа, так как он генерит новое число со следующей секунды... нет ли способа усовершенствовать как то этот подход чтобы повторы были минимальны? кто нить пользовался такой штукой?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
SABROG
  опции профиля:
сообщение 2.8.2010, 17:46
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Юр, мне кажется это не так.

Цитата
The sequence of random numbers generated is deterministic per thread. For example, if two threads call qsrand(1) and subsequently calls qrand(), the threads will get the same random number sequence.


Последовтельность сгенеренных номеров предопределены для каждого потока. Для примера 2 потока вызывают qsrand(1) и подпоследовательность вызывает qrand(), потоки получат ту же последовательность номеров.

Поэтому я предложил такой вариант:

qsrand(QTime(0,0,0).msecsTo(QTime::currentTime())); // вызов в main()
for (int i = 0; i < threads.size(); ++i) {
    int rand = qrand()%100;
    threads[i].setRandomSeed(rand);
}

void MyThread::run()
{
    qsrand(getRandomSeed());
    ...
    qrand()%100;
}


В итоге распределения "семечек" по потокам может быть таким:

Thread 1 - 1
Thread 2 - 50
Thread 3 - 23
Thread 4 - 78
...
А уж от этих "семечек" мы получаем разную последовательность случайных чисел при вызове qrand() в каждом из потоков.

В принципе можно еще как-нибудь так извернуться: qsrand((int)this)

Сообщение отредактировал SABROG - 2.8.2010, 17:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- eldar85   рандом   15.7.2010, 15:36
- - igor_bogomolov   Так ты qsrand(QTime(0,0,0).msecsTo(QTime::currentT...   15.7.2010, 15:41
- - eldar85   хмм, точно))) благодарю)   15.7.2010, 15:44
- - Litkevich Yuriy   eldar85, srand - инициализирует генератор (с чего ...   15.7.2010, 18:54
- - DEADHUNT   зачем использовать какие-то непонятные Qt конструк...   15.7.2010, 20:51
- - Litkevich Yuriy   Цитата(DEADHUNT @ 16.7.2010, 0:51) зачем ...   16.7.2010, 0:39
- - DEADHUNT   Цитата(Litkevich Yuriy @ 16.7.2010, 1:39)...   16.7.2010, 1:27
- - Litkevich Yuriy   Цитата(DEADHUNT @ 16.7.2010, 5:27) а из c...   16.7.2010, 7:52
- - eldar85   все же в многопоточности рандом работает не так ка...   2.8.2010, 12:59
- - SABROG   Оно и понятно, потоки наверняка почти одновременно...   2.8.2010, 14:15
- - Litkevich Yuriy   собственно троли сделали qsrand вместо srand, для ...   2.8.2010, 16:37
- - eldar85   получается что то типа такого, объявляем в мэйне q...   2.8.2010, 16:48
- - Litkevich Yuriy   Цитата(eldar85 @ 2.8.2010, 20:48) как то ...   2.8.2010, 17:20
- - SABROG   Юр, мне кажется это не так. ЦитатаThe sequence of...   2.8.2010, 17:46
- - eldar85   да, вот это уже очень даже рабочая схема будет я д...   2.8.2010, 18:40
- - Litkevich Yuriy   Цитата(SABROG @ 2.8.2010, 21:46) Для прим...   2.8.2010, 23:04


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 5.12.2024, 1:38