Hey all, I want to write a function that will generate a random number, but I want to exclude the last number generated… ie: A random number from 1 to 10 but it cannot be 8… I know how to get a random number between 1 and 10, but how do I exclude 8 without asking later if the number is equal to 8?
on rnd()
set randomNumber to (random number from 1 to 10) as integer
return randomNumber
end rnd
something like this. It passes the last number as parameter
property randomNumber : 0
set randomNumber to rnd(randomNumber)
on rnd(lastNumber)
repeat
set rndNumber to (random number from 1 to 10)
if rndNumber is not lastNumber then return rndNumber
end repeat
end rnd
global lastRnd
set lastRnd to 0
on rnd()
set minVal to 1
set maxVal to 10
if lastRnd ≠0 then
set maxVal to maxVal - minVal - 2
set minVal to 0
end if
set randomNumber to (random number from minVal to maxVal) as integer
set lastRnd to ((randomNumber + lastRnd) mod 10) + 1
return lastRnd
end rnd
Edited to allow for result ranges beginning with other than 1
to make_randomSourceWithNoRepeats(lo, hi)
-- NOTE: By definition, this is less "random" than the even the normal, poor, pseudo random source.
script
property lastValue : missing value
to rnd()
set high to hi
if lastValue is not missing value then
-- reduce the range
set high to high - 1
end if
set randomValue to random number from lo to high
if lastValue is not missing value then
-- adjust the value selected from the reduced range to avoid the previous value
if randomValue ≥ lastValue then
set randomValue to randomValue + 1
end if
end if
set lastValue to randomValue
return randomValue
end rnd
end script
end make_randomSourceWithNoRepeats
set r to make_randomSourceWithNoRepeats(1, 10)
set l to {}
repeat 100 times
set end of l to r's rnd()
end repeat
l