with Ada.Numerics.Discrete_Random;
with Ada.Numerics.Float_Random;
function LZ_Scramble (length : Positive) return String is
subtype Soup_characters is Character range '!' .. '~';
package Letter_soup is new Ada.Numerics.Discrete_Random (Soup_characters);
use Letter_soup, Ada.Numerics.Float_Random;
cg : Letter_soup.Generator;
fg : Ada.Numerics.Float_Random.Generator;
res : String (1 .. length);
d, l : Integer;
begin
Reset (cg);
for i in res'Range loop
res (i) := Random (cg);
end loop;
Reset (fg);
delay Duration (0.001 * (1.0 + Random (fg)));
for redo in 1 .. 3 loop
for i in res'Range loop
if Random (fg) > 0.8 then
d := Integer ((Random (fg) - 0.5) * Float (length));
l := Integer ((Random (fg)) * Float (abs d) * 0.9);
for j in 0 .. l - 1 loop
if i + j in res'Range and i + d + j in res'Range then
res (i + j) := res (i + d + j);
end if;
end loop;
end if;
end loop;
end loop;
return res;
end LZ_Scramble;