рандом |
Здравствуйте, гость ( Вход | Регистрация )
рандом |
Litkevich Yuriy |
2.8.2010, 16:37
Сообщение
#11
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
собственно троли сделали qsrand вместо srand, для того, чтобы эту функцию можно было в каждом потоке вызывать. И тогда у каждого потока будет своё начальное значение.
|
|
|
eldar85 |
2.8.2010, 16:48
Сообщение
#12
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
получается что то типа такого, объявляем в мэйне
затем в каждом потоке
как то так чтоли? а потоки у меня запускаются каждые 0,1 сек Сообщение отредактировал eldar85 - 2.8.2010, 16:54 |
|
|
Litkevich Yuriy |
2.8.2010, 17:20
Сообщение
#13
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
как то так чтоли? нет.функция srand предназначена для задания начального значения Псевдослучайной Последовательности (ПСП). Т.е. её вызывают один раз и всё. Но если тебе нужно использовать ПСП в нескольких потоках, то в каждом потоке, в самом начале, вызови qsrand, а затем, для получения очередного значения ПСП, только qrand П.С. Отличие трольтеховских функций от стандартных: Если бы ты использовал стандартные srand/rand, вместо qsrand/qrand, то получилось бы так: каждый вызов srand влиял бы на все потоки, т.е. для всех потоков устанавливалось бы одно и тоже начальное значение. Справка: Буква s в названии функции означает seed - сеятель, значение с которого начинается генерация ПСП |
|
|
SABROG |
2.8.2010, 17:46
Сообщение
#14
|
Профессионал Группа: Участник Сообщений: 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(), потоки получат ту же последовательность номеров. Поэтому я предложил такой вариант:
В итоге распределения "семечек" по потокам может быть таким: Thread 1 - 1 Thread 2 - 50 Thread 3 - 23 Thread 4 - 78 ... А уж от этих "семечек" мы получаем разную последовательность случайных чисел при вызове qrand() в каждом из потоков. В принципе можно еще как-нибудь так извернуться: qsrand((int)this) Сообщение отредактировал SABROG - 2.8.2010, 17:48 |
|
|
eldar85 |
2.8.2010, 18:40
Сообщение
#15
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
да, вот это уже очень даже рабочая схема будет я думаю))) спасибо за совет)) завтра буду внедрять)))
|
|
|
Litkevich Yuriy |
2.8.2010, 23:04
Сообщение
#16
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Для примера 2 потока вызывают qsrand(1) и подпоследовательность вызывает qrand(), потоки получат ту же последовательность номеров. ты не понял, о чём я написал.Представь, что не оба потока инициализировали ПСП, а только один, он успел несколько раз дёрнуть генератор. Следующее значение ПСП допустим равно 100. В этот момент второй поток инициализирует генератор тем же значением что и первый. Вот в этой ситуации стандартные функции приведут к тому, что у первого потока ПСП собьётся. А при использовании Qt версии этих функций этого не произойдёт. |
|
|
Текстовая версия | Сейчас: 5.12.2024, 7:42 |