69 lines
1.6 KiB
Text
69 lines
1.6 KiB
Text
function move(sequence s, integer amount, integer src, integer dest)
|
|
if src < 1 or src > length(s) or dest < 1 or dest > length(s) or amount < 0 then
|
|
return -1
|
|
else
|
|
if src != dest and amount then
|
|
if amount > s[src] then
|
|
amount = s[src]
|
|
end if
|
|
s[src] -= amount
|
|
s[dest] += amount
|
|
end if
|
|
return s
|
|
end if
|
|
end function
|
|
|
|
sequence buckets
|
|
buckets = repeat(100,10)
|
|
|
|
procedure equalize()
|
|
integer i, j, diff
|
|
while 1 do
|
|
i = rand(length(buckets))
|
|
j = rand(length(buckets))
|
|
diff = buckets[i] - buckets[j]
|
|
if diff >= 2 then
|
|
buckets = move(buckets, floor(diff / 2), i, j)
|
|
elsif diff <= -2 then
|
|
buckets = move(buckets, -floor(diff / 2), j, i)
|
|
end if
|
|
task_yield()
|
|
end while
|
|
end procedure
|
|
|
|
procedure redistribute()
|
|
integer i, j
|
|
while 1 do
|
|
i = rand(length(buckets))
|
|
j = rand(length(buckets))
|
|
if buckets[i] then
|
|
buckets = move(buckets, rand(buckets[i]), i, j)
|
|
end if
|
|
task_yield()
|
|
end while
|
|
end procedure
|
|
|
|
function sum(sequence s)
|
|
integer sum
|
|
sum = 0
|
|
for i = 1 to length(s) do
|
|
sum += s[i]
|
|
end for
|
|
return sum
|
|
end function
|
|
|
|
atom task
|
|
|
|
task = task_create(routine_id("equalize"), {})
|
|
task_schedule(task, 1)
|
|
|
|
task = task_create(routine_id("redistribute"), {})
|
|
task_schedule(task, 1)
|
|
|
|
task_schedule(0, {0.5, 0.5})
|
|
|
|
for i = 1 to 24 do
|
|
print(1,buckets)
|
|
printf(1," sum: %d\n", {sum(buckets)})
|
|
task_yield()
|
|
end for
|