Chapter #5 Examples in Oz
% Utility functions
fun {RandomInt Min Max}
X = {OS.rand}
MinOS
MaxOS
in
{OS.randLimits ?MinOS ?MaxOS}
Min + X*(Max - Min) div (MaxOS - MinOS)
end
{OS.srand 0}
proc {ArrayExchange A I J}
X = A.I
in
A.I := A.J
A.J := X
end
Swap = ArrayExchange
% 5.3 Randomize In Place
proc {RandomizeInPlace A}
N = {Array.high A}
in
for I in 1..N do
{ArrayExchange A I {RandomInt I N}}
end
end
local
A = {Tuple.toArray 1#2#3#4#5#6}
in
{RandomizeInPlace A}
{Browse 'RandomizeInPlace'#{Array.toRecord '#' A}}
end
% 5.3 Permute With All
proc {PermuteWithAll A}
N = {Array.high A}
in
for I in 1..N do
{Swap A I {RandomInt 1 N}}
end
end
local
A = {Tuple.toArray 1#2#3#4#5#6}
in
{PermuteWithAll A}
{Browse 'PermuteWithAll'#{Array.toRecord '#' A}}
end
% 5.3 Permute By Cyclic
fun {PermuteByCyclic A}
N = {Array.high A}
Offset = {RandomInt 1 N}
B = {NewArray {Array.low A} {Array.high A} _}
in
for I in 1..N do
local
Dest = {NewCell I+Offset}
in
if @Dest > N then
Dest := @Dest - N
end
B.@Dest := A.I
end
end
B
end
local
A = {Tuple.toArray 1#2#3#4#5#6}
in
{Browse 'PermuteByCyclic'#{Array.toRecord '#' {PermuteByCyclic A}}}
end
% 5.4 On Line Maximum
fun {OnLineMaximum Score K N}
Return = {NewCell N}
BestScore = {NewCell undefined}
in
for I in 1..K do
if @BestScore == undefined orelse Score.I > @BestScore then
BestScore := Score.I
end
end
for I in (K+1)..N do
if Score.I > @BestScore then
Return := I
end
end
@Return
end
local
A = {Tuple.toArray 80#70#90#80#95#60}
in
{Browse 'OnLineMaximum'#{OnLineMaximum A 4 6}}
end
|