Уникальное рандомное число в многопотоке.
-
Скрипт работает в 20 потоков и использует функцию "случайное число", но иногда числа дублируются. Чтобы этого избежать, думаю можно реализовать через глобальные переменные, чтобы один поток генерировал случайные числа и раздавал остальным.. Хотя интуиция подсказывает, что проще это сделать через ресурс. Как ресурс из файла, со строками, после использования которых, удаляют.. Но файл тогда каждый раз придётся восстанавливать.
Подскажите, как можно реализовать использование уникального случайного числа в многопотоке?
-
@Fox можно вот таким способом, действие "Установить переменную" тип значения выражение
rand(1, 100).toString() + thread_number()
-
@Fox Самый простой способ - устанавливаете очень большое число для параметра Максимальное Значение. 2147483647
Таким образом, вероятность совпадения будет маленькая.
Если есть уверенность, что каждый поток будет брать не больше чем n чисел, то можно такrand(1, n) + thread_number() * n
Если нужна 100% уверенность, что числа не будут повторятся, то можно в OnApplicationStart создать список 1,2,3,4, ... перемешать его соответствующим действием и записать в ресурс, потом в основных потоках использовать этот ресурс.
-
@support said in Уникальное рандомное число в многопотоке.:
Если нужна 100% уверенность, что числа не будут повторятся, то можно в OnApplicationStart создать список 1,2,3,4, ... перемешать его соответствующим действием и записать в ресурс, потом в основных потоках использовать этот ресурс.
Думаю так и сделать. Получается каждый ресурс будет брать своё значение и оно будет удалятся из списка. А если мне понадобится снова полный список, скажем через пол часа?
Reload('ИМЯ РЕСУРСА')
Поможет команда?
-
Попробовал я создать список, перемешать его и добавить в ресурс. В итоге, из ресурса переменная берёт все значения сразу. Решил добавлять значения в ресурс по одному, в цикле. Всё работает, только вот пермешать цифры в ресурсе не выходит, плюс обновить ресурс командой
Reload('ИМЯ РЕСУРСА')
тоже не получается.
Вот тестовый проект
-
Блин, команда обновляет ресурс в пустой.. Видимо.
-
Попробовал сделать через файл, создать список, перемешать его, сохранить в файл. Ресурс из файла работает. Но каждый раз после обновления Reload('ИМЯ РЕСУРСА'), данные идут в том же порядке, так как в файле, что логично, ведь они так и записаны. Плюс в многопотоке, в разное время, разные потоки будут использовать команду Reload('ИМЯ РЕСУРСА'), а значит, что может получится несколько подряд первых чисел в списке.
Задача вроде простая, есть диапазон чисел, к примеру, от 1 до 10. Пять потоков берут уникальное, рандомное число и пишут в лог. После определённого условия, список обновляется и потоки уже берут другие случайные цифры, можно и такие же как в первый раз. Но не всегда одни и те же.
Вариант с ресурсом из файла
-
О! Есть же галочка в ресурсе "Мешать строки" !
-
Один фиг, обновляешь ресурс, а он не перемешивает по новой строки, выходит что он каждый раз, будет одни и те же цифры давать тем же потокам.
-
@Fox Вот пример проекта.
0_1493396436214_randomstringfromres.xml
-
Спасибо. Я как то и не подумал, что в список можно индекс цикла записывать. Решение интересное, но мою проблему не решит.
При открытии скрипта в функции OnApplicationStart создаётся ресурс random, после первого использования если я восстановлю его командой Reload('random'), то те же потоки, возьмут те же числа.
Вот например.
-
@Fox Зачем нужен вообще нужен вызов Reload('random'), помойму мой проект решает проблему, которая описана в топике.
-
@support Я в первом сообщении темы не полностью развернул суть проблемы. Дело в том, что скрипт работает неделями без остановок. А случайные числа используются раз 10 в день. Основная проблема именно в повторном использовании ресурса.
Была бы команда перемешать по новой строки в ресурсе..
-
Дело в том, что скрипт работает неделями без остановок. А случайные числа используются раз 10 в день.
Все равно не очень понимаю почему мой вариант не подходит, там генерируется 10000 чисел, при использовании по 10 день хватит очень надолго.
Была бы команда перемешать по новой строки в ресурсе..
Есть команда RPickRandom(name, size) возможно она поможет