немного исправленная версия генератора чисел от скорпиота, решил пихнуть хэштаблицу
мне не понравилась его версия потому что она обрывает поток (отсутствует нужная проверка на highBound)
код
library RandomIntGenMem
globals
    private constant hashtable H = InitHashtable( )
    constant key RandomIntKey
endglobals

function ClearRandomIntMem takes nothing returns nothing
    call FlushChildHashtable( H, RandomIntKey )
endfunction

function GetRandomIntMem takes integer lowBound, integer highBound returns integer
    local integer r
    local integer simple
    
    if highBound <= lowBound then
        return highBound
    endif
    
    set simple = GetRandomInt( lowBound, highBound )
    set r = simple
    
    loop
        exitwhen not HaveSavedBoolean( H, RandomIntKey, r )
        
        if r < highBound and r >= simple then
            set r = r + 1
        elseif r == highBound and simple > lowBound then
            set r = simple - 1
        elseif r > lowBound and r < simple then
            set r = r - 1
        elseif r <= lowBound or r >= highBound then
            set r = simple
            exitwhen true
        endif
    endloop
    
    if HaveSavedBoolean( H, RandomIntKey, r ) then
        call FlushChildHashtable( H, RandomIntKey )
    endif
    
    call SaveBoolean( H, RandomIntKey, r, true )
    
    return r
endfunction
endlibrary
я бы просто оставил коммент под оригинальным ресом, но тогда бан дадут за археологию, так что пусть идут нафиг
`
ОЖИДАНИЕ РЕКЛАМЫ...
38
Старый код. Эффективный способ - создать массив чисел от 1 до N, после чего перемешать его и брать по очереди

А пункт об археологии давно упразднили
38
Там тоже потолок есть, массив можно новый генерить при достижении последнего элемента. Или вообще на основе этого класс построить, который будет эти массивы генерить.
надо же разнообразить иногда
Чтобы оставить комментарий, пожалуйста, войдите на сайт.