Contributor: SWAG SUPPORT TEAM        

{Another method to acComplish this (which only requires an order of n
itterations is to generate an Array initialized from 2 to 1000 and then
randomize that Array.  For your 400 numbers, just take 400 values in the
new sequence (starting at the index of your lowest number). You can do
that as follows:
}

Const MaxNumber = 2000;
Type SeqArray = Array [1..MaxNumber] of Integer;

{================================================================}
Procedure RandomizeSeq (first, last: Integer; Var iseq: SeqArray);
{================================================================}

Var           i, iran,
           temp, imax : Integer;
                    r : Real;
{
  Operation:  A random number within the range 1..last is generated
  on each pass and the upper limit of the random number generated is
  decreased by 1.  The value stored at the highest index of the last
  pass is moved to the location of the last number selected.

  Parameters:
    first = lowest number in sequence.
     last = highest number in sequence.
     iseq = Sequence Array
}
begin
   { initialize sequence Array }
   For i := first to last do iseq[i] := i;
   Randomize;
   { randomize the sorted Array }
   For imax := last downto first do begin
      { get a random number between 0 and 1 and scale up to
        an Integer in the range of first to last }
      r := random;
      iran := Trunc(r*imax) + first;
      { replace With value at highest index }
      temp := iseq[iran];
      iseq[iran] := iseq[imax];
      iseq[imax] := temp
   end;
end;

{ Example of generating 20 random numbers from 2 to 100: }

Var i : Integer;
    a : SeqArray;
begin
   RandomizeSeq(2,100,a);
   For i := 2 to 21 do Write(a[i]:3); Writeln;
end.