Delphi 随机化数组?
在pascal中,我想随机组织一个数组。因此,大多数情况下,阵列的组织方式应该不同 请考虑此阵列设置Delphi 随机化数组?,delphi,list,pascal,Delphi,List,Pascal,在pascal中,我想随机组织一个数组。因此,大多数情况下,阵列的组织方式应该不同 请考虑此阵列设置 const ARRAY_ELEMENTS = 3; SetLength(iIndex, ARRAY_ELEMENTS); for i := Low(iIndex) to High(iIndex) do begin case i of 0: iIndex[i] := 0; 1: iIndex[i] := 1; 2: iIndex[i] := 2; end; e
const
ARRAY_ELEMENTS = 3;
SetLength(iIndex, ARRAY_ELEMENTS);
for i := Low(iIndex) to High(iIndex) do
begin
case i of
0: iIndex[i] := 0;
1: iIndex[i] := 1;
2: iIndex[i] := 2;
end;
end;
包含值0的
iIndex[]
怎么可能不总是在数组的第一个元素中,而iIndex[]
包含值2的数组并不总是数组的最后一个值,而是随机生成数组的顺序,以便在初始化时数组的顺序不总是相同的?此代码将置换一个整数数组,但我不确定它是否是最优的(可能不是)
一种更快但不那么酷的方法是随机交换项目,一次交换一对:
procedure FastPermuteArray(A: TDynIntegerArray);
procedure Swap(n, m: integer);
var
tmp: integer;
begin
tmp := A[n];
A[n] := A[m];
A[m] := tmp;
end;
var
i: Integer;
begin
for i := High(A) downto 1 do
Swap(i, RandomRange(0, i));
end;
这段代码排列一个整数数组,但我不确定它是否是最优的(可能不是) 一种更快但不那么酷的方法是随机交换项目,一次交换一对:
procedure FastPermuteArray(A: TDynIntegerArray);
procedure Swap(n, m: integer);
var
tmp: integer;
begin
tmp := A[n];
A[n] := A[m];
A[m] := tmp;
end;
var
i: Integer;
begin
for i := High(A) downto 1 do
Swap(i, RandomRange(0, i));
end;
试着这样做:
uses
System.Generics.Collections;
const
ARRAY_ELEMENTS = 3;
var
iArray: array of Integer;
iIndex: TList<Integer>;
I, j: Integer;
begin
Randomize;
SetLength(iArray, ARRAY_ELEMENTS);
iIndex := TList<Integer>.Create;
try
iIndex.Count := ARRAY_ELEMENTS;
for i := 0 to Pred(ARRAY_ELEMENTS) do
iIndex[i] := i;
for i := Low(iArray) to High(iArray) do
begin
j := Random(iIndex.Count);
iArray[iIndex[j]] := i;
iIndex.Delete(j);
end;
finally
iIndex.Free;
end;
end;
试着这样做:
uses
System.Generics.Collections;
const
ARRAY_ELEMENTS = 3;
var
iArray: array of Integer;
iIndex: TList<Integer>;
I, j: Integer;
begin
Randomize;
SetLength(iArray, ARRAY_ELEMENTS);
iIndex := TList<Integer>.Create;
try
iIndex.Count := ARRAY_ELEMENTS;
for i := 0 to Pred(ARRAY_ELEMENTS) do
iIndex[i] := i;
for i := Low(iArray) to High(iArray) do
begin
j := Random(iIndex.Count);
iArray[iIndex[j]] := i;
iIndex.Delete(j);
end;
finally
iIndex.Free;
end;
end;
您可以随机交换/洗牌数组中的元素。所以您的问题是?您的代码毫无意义…您希望值与索引随机关联,同时保持整个值集与索引集相同?这似乎确实是@TLama所面临的问题。@TLama,恕我直言,那
Shuffle
方法灼伤了我的眼睛:)你可以随机交换/洗牌数组中的元素。所以你的问题是?你的代码毫无意义……你希望值与索引随机关联,同时保持整个值集与索引集相同?这似乎确实是@TLama所涉及的问题。@TLama,尽管我对Zarko表示尊敬,但那种Shuffle
方法灼伤了我的眼睛:)“π”。。。认识你,这是一个我不懂的笑话。@kobik:嗯,它是用Delphi2009+编译的。但当然,您可以将变量重命名为Pi或其他名称。(在数学中,排列通常用π表示。)[我想,真正糟糕的笑话是这个算法的性能很差。我从来没有真正研究过实用的算法,所以可能有一个更好的“教科书”算法来解决这个问题。]+1,你的第二种方法实际上很“酷”,而且足够简单,可以正确地完成这项工作。只需在开始时添加Randomize。不要在过程中添加Randomize,因为它通常只应调用一次。洗牌是不统一的。搜索Fisher Yates shuffle。我和其他人之前在这里用费舍尔·耶茨的洗牌回答了这个问题。。。认识你,这是一个我不懂的笑话。@kobik:嗯,它是用Delphi2009+编译的。但当然,您可以将变量重命名为Pi或其他名称。(在数学中,排列通常用π表示。)[我想,真正糟糕的笑话是这个算法的性能很差。我从来没有真正研究过实用的算法,所以可能有一个更好的“教科书”算法来解决这个问题。]+1,你的第二种方法实际上很“酷”,而且足够简单,可以正确地完成这项工作。只需在开始时添加Randomize。不要在过程中添加Randomize,因为它通常只应调用一次。洗牌是不统一的。搜索Fisher Yates shuffle。我和其他人之前已经用Fisher-Yates shuffle回答了Q,这和我的第一个算法基本相同。所以我猜它可以工作,但比Fisher-Yates慢得多。堆分配?!!为什么?对你有利的是,这个算法确实产生了均匀分布的洗牌。我不明白你为什么不这么说。但是没有理由在这里重新发明轮子。洗牌是最基本的。当然,你的第一个调用端口是一个web搜索,以找出这个主题上已经存在的知识体?这基本上与我的第一个算法相同。所以我猜它可以工作,但比Fisher-Yates慢得多。堆分配?!!为什么?对你有利的是,这个算法确实产生了均匀分布的洗牌。我不明白你为什么不这么说。但是没有理由在这里重新发明轮子。洗牌是最基本的。当然,你的第一个选择是通过网络搜索来找出这个主题上已经存在的知识体系?