Use Fisher–Yates shuffle (#3030)

This commit is contained in:
bormant 2024-01-22 14:05:16 +03:00 committed by GitHub
parent be92ef2104
commit 04e17b7ba8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8882,17 +8882,15 @@ end;
procedure Shuffle<T>(a: array of T);
begin
var n := a.Length;
for var i := 0 to n - 1 do
Swap(a[i], a[Random(n)]);
for var i := a.Length - 1 downto 1 do
Swap(a[i], a[Random(i + 1)]);
end;
procedure Shuffle<T>(l: List<T>);
begin
var n := l.Count;
for var i := 0 to n - 1 do
for var i := l.Count - 1 downto 1 do
begin
var ind := Random(n);
var ind := Random(i + 1);
var v := l[i];
l[i] := l[ind];
l[ind] := v;
@ -10756,10 +10754,9 @@ end;
/// Перемешивает элементы списка случайным образом
function Shuffle<T>(Self: List<T>): List<T>; extensionmethod;
begin
var n := Self.Count;
for var i := 0 to n - 1 do
for var i := Self.Count - 1 downto 1 do
begin
var r := Random(n);
var r := Random(i + 1);
var v := Self[i];
Self[i] := Self[r];
Self[r] := v;
@ -11814,9 +11811,8 @@ end;
/// Перемешивает элементы массива случайным образом
function Shuffle<T>(Self: array of T): array of T; extensionmethod;
begin
var n := Self.Length;
for var i := 0 to n - 1 do
Swap(Self[i], Self[Random(n)]);
for var i := Self.Length - 1 downto 1 do
Swap(Self[i], Self[Random(i + 1)]);
Result := Self;
end;