-- Abstract :
--
-- see spec
--
-- Copyright (C) 2008 - 2009, 2012, 2015 Stephen Leake. All Rights Reserved.
--
-- This library is free software; you can redistribute it and/or
-- modify it under terms of the GNU General Public License as
-- published by the Free Software Foundation; either version 3, or (at
-- your option) any later version. This library is distributed in the
-- hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-- PURPOSE. See the GNU General Public License for more details. You
-- should have received a copy of the GNU General Public License
-- distributed with this program; see file COPYING. If not, write to
-- the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
-- MA 02111-1307, USA.
--
-- As a special exception, if other files instantiate generics from
-- this unit, or you link this unit with other files to produce an
-- executable, this unit does not by itself cause the resulting
-- executable to be covered by the GNU General Public License. This
-- exception does not however invalidate any other reasons why the
-- executable file might be covered by the GNU Public License.
pragma License (Modified_GPL);
with Ada.Numerics.Float_Random;
procedure SAL.Gen_Randomize_Doubly_Linked_Lists (Container : in out Lists.List; Seed : in Integer := 0)
is
use Ada.Containers;
use Lists;
Result_Count : constant Count_Type := Container.Length;
Source_Count : Count_Type := Result_Count;
Result : List;
I : Cursor;
Generator : Ada.Numerics.Float_Random.Generator;
procedure Random_Next (I : out Cursor)
is
-- Produce an integer in range 0 .. source_count - 1, all with equal probability
Rnd : constant Float := Ada.Numerics.Float_Random.Random (Generator);
Step : constant Integer := Integer (Float'Floor ((Float (Source_Count) - Float'Model_Epsilon) * Rnd));
begin
I := First (Container);
for J in 1 .. Step loop
Next (I);
end loop;
end Random_Next;
begin
if Seed /= 0 then
Ada.Numerics.Float_Random.Reset (Generator, Seed);
end if;
for J in 1 .. Result_Count loop
Random_Next (I);
Splice
(Target => Result,
Before => No_Element,
Source => Container,
Position => I);
Source_Count := Source_Count - 1;
end loop;
Splice
(Target => Container,
Before => No_Element,
Source => Result);
end SAL.Gen_Randomize_Doubly_Linked_Lists;