Уникальное рандомное число в многопотоке.


  • administrators

    @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. Пять потоков берут уникальное, рандомное число и пишут в лог. После определённого условия, список обновляется и потоки уже берут другие случайные цифры, можно и такие же как в первый раз. Но не всегда одни и те же.
    Вариант с ресурсом из файла



  • О! Есть же галочка в ресурсе "Мешать строки" !



  • Один фиг, обновляешь ресурс, а он не перемешивает по новой строки, выходит что он каждый раз, будет одни и те же цифры давать тем же потокам.


  • administrators

    @Fox Вот пример проекта.
    0_1493396436214_randomstringfromres.xml



  • Спасибо. Я как то и не подумал, что в список можно индекс цикла записывать. Решение интересное, но мою проблему не решит.
    При открытии скрипта в функции OnApplicationStart создаётся ресурс random, после первого использования если я восстановлю его командой Reload('random'), то те же потоки, возьмут те же числа.
    Вот например.


  • administrators

    @Fox Зачем нужен вообще нужен вызов Reload('random'), помойму мой проект решает проблему, которая описана в топике.



  • @support Я в первом сообщении темы не полностью развернул суть проблемы. Дело в том, что скрипт работает неделями без остановок. А случайные числа используются раз 10 в день. Основная проблема именно в повторном использовании ресурса.
    Была бы команда перемешать по новой строки в ресурсе..


  • administrators

    @Fox

    Дело в том, что скрипт работает неделями без остановок. А случайные числа используются раз 10 в день.

    Все равно не очень понимаю почему мой вариант не подходит, там генерируется 10000 чисел, при использовании по 10 день хватит очень надолго.

    Была бы команда перемешать по новой строки в ресурсе..

    Есть команда RPickRandom(name, size) возможно она поможет


Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.