crossplatform.ru

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


  Ответ в рандом
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 2.8.2010, 23:04
 
Цитата(SABROG @ 2.8.2010, 21:46) *
Для примера 2 потока вызывают qsrand(1) и подпоследовательность вызывает qrand(), потоки получат ту же последовательность номеров.
ты не понял, о чём я написал.
Представь, что не оба потока инициализировали ПСП, а только один, он успел несколько раз дёрнуть генератор. Следующее значение ПСП допустим равно 100.
В этот момент второй поток инициализирует генератор тем же значением что и первый.

Вот в этой ситуации стандартные функции приведут к тому, что у первого потока ПСП собьётся. А при использовании Qt версии этих функций этого не произойдёт.
eldar85 Дата 2.8.2010, 18:40
  да, вот это уже очень даже рабочая схема будет я думаю))) спасибо за совет)) завтра буду внедрять)))
SABROG Дата 2.8.2010, 17:46
  Юр, мне кажется это не так.

Цитата
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)
Litkevich Yuriy Дата 2.8.2010, 17:20
 
Цитата(eldar85 @ 2.8.2010, 20:48) *
как то так чтоли?
нет.
функция srand предназначена для задания начального значения Псевдослучайной Последовательности (ПСП). Т.е. её вызывают один раз и всё.
Но если тебе нужно использовать ПСП в нескольких потоках, то в каждом потоке, в самом начале, вызови qsrand, а затем, для получения очередного значения ПСП, только qrand


П.С.
Отличие трольтеховских функций от стандартных:
Если бы ты использовал стандартные srand/rand, вместо qsrand/qrand, то получилось бы так:
каждый вызов srand влиял бы на все потоки, т.е. для всех потоков устанавливалось бы одно и тоже начальное значение.
Справка:
Буква s в названии функции означает seed - сеятель, значение с которого начинается генерация ПСП
eldar85 Дата 2.8.2010, 16:48
  получается что то типа такого, объявляем в мэйне
qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()));


затем в каждом потоке
int rand = qrand()%100;
qsrand(rand);


как то так чтоли?


а потоки у меня запускаются каждые 0,1 сек
Litkevich Yuriy Дата 2.8.2010, 16:37
  собственно троли сделали qsrand вместо srand, для того, чтобы эту функцию можно было в каждом потоке вызывать. И тогда у каждого потока будет своё начальное значение.
SABROG Дата 2.8.2010, 14:15
  Оно и понятно, потоки наверняка почти одновременно запускаются, не успевает даже время пройти. Ты вызови один раз qsrand(), потом вызови qrand() для каждого потока, затем в каждом потоке вызови снова qsrand(), но уже со значениями полученными от предыдущего qrand'a().
eldar85 Дата 2.8.2010, 12:59
  все же в многопоточности рандом работает не так как хотелось бы, точнее вообще показывает очень часто одно и тоже число в каждом потоке. запускаю я к примеру 10 потоков. запуск каждого потока производится каждые 0,1 сек.
qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()));
объявлял в главной main функции и всюду, эфект почти один и тот же.
генератор числа в небольшом диапазоне, оьычно от 100 до 200.
 int rand = qrand()%100;

но потоки прям один за другим выдают одно и тоже число, затем несколько потоков могут что то иное выдать, но это как исключение. как быть?
Litkevich Yuriy Дата 16.7.2010, 7:52
 
Цитата(DEADHUNT @ 16.7.2010, 5:27) *
а из cstdlib нельзя?
тыц
DEADHUNT Дата 16.7.2010, 1:27
 
Цитата(Litkevich Yuriy @ 16.7.2010, 1:39) *
те что в Qt можно использовать в разных потоках

а из cstdlib нельзя? :blink: там для каждого потока отводится переменная(в VC++ например) с текущем значением(да и вообще реализация скрыта от пользователей).
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 2:35