Уникальное рандомное число в многопотоке.
-
@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) возможно она поможет