Инициализация:
Задать private constant integer RandMemMax на нужное количество запоминаемых чисел. Максимум: 8191
Использование:
Функция GetRandomIntMem принимает 2 integer: нижняя граница и верхняя граница, включительно. Возвращает случайный integer (между ними). Сгенерированные ранее числа хранятся в массиве размером RandMemMax, при переполнении массив полностью обнуляется. Поэтому следует задавать его с оценкой обращений.
Функция ClearRandomIntMem ничего не принимает и не возвращает. Используется для обнуления массива запомненных чисел после сессии обращений.
Задать private constant integer RandMemMax на нужное количество запоминаемых чисел. Максимум: 8191
Использование:
Функция GetRandomIntMem принимает 2 integer: нижняя граница и верхняя граница, включительно. Возвращает случайный integer (между ними). Сгенерированные ранее числа хранятся в массиве размером RandMemMax, при переполнении массив полностью обнуляется. Поэтому следует задавать его с оценкой обращений.
Функция ClearRandomIntMem ничего не принимает и не возвращает. Используется для обнуления массива запомненных чисел после сессии обращений.
library RandomIntGenMem
globals
public integer RandMemMax = 100
private integer array RandMem
private integer RandMemSize = 0
endglobals
private function CheckRandMem takes integer value returns boolean
local integer i = 0
loop
exitwhen i >= RandMemSize
if value == RandMem[i] then
return false
endif
set i=i+1
endloop
return true
endfunction
private function SaveRandMem takes integer value returns boolean
if RandMemSize > RandMemMax then
return false
endif
set RandMem[RandMemSize] = value
set RandMemSize=RandMemSize+1
return true
endfunction
function ClearRandomIntMem takes nothing returns nothing
set RandMemSize = 0
endfunction
function GetRandomIntMem takes integer lowBound, integer highBound returns integer
local integer r
local integer simple = 0
if highBound<=lowBound or (highBound-lowBound) > RandMemMax then
return highBound
endif
set simple = GetRandomInt(lowBound,highBound)
set r = simple
// BJDebugMsg("GetRandomIntMem: l="+I2S(lowBound)+",h="+I2S(highBound)+",si="+I2S(simple))
loop
exitwhen CheckRandMem(r)
if r<highBound and r>=simple then
set r=r+1 // BJDebugMsg("GetRandomIntMem: r=r+1 ("+I2S(r)+")")
elseif r==highBound and simple>lowBound then
set r=simple-1 // BJDebugMsg("GetRandomIntMem: r=simple-1 ("+I2S(r)+")")
elseif r>lowBound and r<simple then
set r=r-1 // BJDebugMsg("GetRandomIntMem: r=r-1 ("+I2S(r)+")")
elseif r<=lowBound then
set r=lowBound // BJDebugMsg("GetRandomIntMem: r<=lowBound; exit ("+I2S(r)+")")
exitwhen true
endif
endloop // BJDebugMsg("GetRandomIntMem: exit")
if SaveRandMem(r) then
return r
else
call ClearRandomIntMem()
call SaveRandMem(r)
return r
endif
endfunction
endlibrary
Простой пример
call BJDebugMsg(I2S( GetRandomIntMem(1,3) )) // 3
call BJDebugMsg(I2S( GetRandomIntMem(1,3) )) // 2
call BJDebugMsg(I2S( GetRandomIntMem(1,3) )) // 1
call ClearRandomIntMem()
call BJDebugMsg(I2S( GetRandomIntMem(1,3) )) // 2, память была сброшена
Ред. ScorpioT1000
добавлена карта-пример
я сказал, добавлена =( хеллкор, иди вилкой фикси.