Randomize StringList

后端 未结 3 1421
有刺的猬
有刺的猬 2020-12-06 10:41

How can I randomize the Strings in the StringList similarly how this online tool works. If anyone is familiar with it, check this: http://textmechanic.co/Randomize-List.html

相关标签:
3条回答
  • 2020-12-06 11:24

    Just loop through the stringlist and give each item an different random place:

    for i := StringList.Count - 1 downto 1 do
      StringList.Exchange(i, Random(i+1));
    

    [edit] Altered the loop a bit to make the shuffling uniform.

    0 讨论(0)
  • 2020-12-06 11:26

    One common algorithm to perform a shuffle is the Fisher-Yates shuffle. This generates uniformly distributed permutations.

    To implement on a Delphi TStrings object you can use this:

    procedure Shuffle(Strings: TStrings);
    var
      i: Integer;
    begin
      for i := Strings.Count-1 downto 1 do 
        Strings.Exchange(i, Random(i+1));
    end;
    

    Now, whilst in theory this will generate uniformly distributed permutations, the actual performance depends heavily on the quality of the random number generator. This is discussed in Knuth's Art of Computer Programming, volume 2, section 3.4.2, Algorithm P.

    Further reading:

    • Fisher-Yates shuffle (Wikipedia)
    • Jeff Attwood's two blog articles on shuffling: Shuffling and The Danger of Naïveté
    • The intuition behind Fisher-Yates shuffling (Eli Bendersky)
    • Art of Computer Programming, Donald Knuth, volume 2, section 3.4.2
    • Shuffling (Wikipedia)
    0 讨论(0)
  • 2020-12-06 11:31

    To randomize a TStrings, create a comparer from TComparer with random result value, and sort the TStrings with it.

    /// The Comparer
    TMyShuffleComparer= class(TComparer<string>)
    public
      function Compare(const Left, Right: string): Integer; override;
    end;
    
    /// The randomizer 
    function TMyShuffleComparer.Compare(const Left, Right: TCard): Integer;
    begin
      // To sort, get a random number for compare result
      Result := Random(100) - 50;
    end;
    
    /// How to call the comparer
    procedure TMyStrings.Shuffle;
    begin
     Sort(TMyShuffleComparer.Create);
    end;
    

    or to call directly:

      /// Shuffle
      MyString.Sort(TMyShuffleComparer.Create);
    
    0 讨论(0)
提交回复
热议问题