Arrays 不能在不获得交叉和超出范围的值的情况下洗牌两个数组
我有两个数组要洗牌。下面您将看到声明和一个shuffle示例Arrays 不能在不获得交叉和超出范围的值的情况下洗牌两个数组,arrays,delphi,shuffle,Arrays,Delphi,Shuffle,我有两个数组要洗牌。下面您将看到声明和一个shuffle示例 var highNums : array[1..9] of integer; lowNums : array[1..20] of integer; begin Q := 0; for I := 1 to Length(highNums) do begin highNums[I] := q; end; for K := 1 to Length(lowNums) do begin lo
var
highNums : array[1..9] of integer;
lowNums : array[1..20] of integer;
begin
Q := 0;
for I := 1 to Length(highNums) do
begin
highNums[I] := q;
end;
for K := 1 to Length(lowNums) do
begin
lowNums[K] := q;
end;
bigNums[] {25 ..225} every 25
lowNumes[] {1..10} two of each number
procedure shuffleHighArray();
var
I, ToSwapHigh, HighTemp : integer;
begin
for I := 1 to length(highNums) do
begin
toSwapHigh := Random(length(highNums));
HighTemp := highNums[I];
highNums[I] := highNums[toSwapHigh];
highNums[toSwapHigh] := HighTemp;
end;
end;
procedure shuffleLowArray();
var
K, ToSwapLow, LowTemp : integer;
begin
for K := 1 to length(lowNums) do
begin
toSwapLow := random(length(lowNums));
LowTemp := lowNums[K];
lowNums[K] := lowNums[toSwapLow];
lowNums[toSwapLow] := LowTemp;
end;
end;
以下是我正在使用的过程以及两个数组的声明。感谢您的帮助您应该使用一种通用方法来洗牌数组 我为你写了这封信:
uses
System.Math;
type
TArrayHelper = class abstract
public
class constructor Create;
class procedure PermuteArray<T>(var A: array of T);
end;
{ TArrayHelper }
class constructor TArrayHelper.Create;
begin
Randomize;
end;
class procedure TArrayHelper.PermuteArray<T>(var A: array of T);
var
Tmp: T;
i, j: Integer;
begin
for i := High(A) downto low(A) do
begin
j := RandomRange(0, i);
Tmp := A[i];
A[i] := A[j];
A[j] := Tmp;
end;
end;
请注意,Random(N)返回一个范围为0..N-1的数字,而数组的索引很低,为1。@Lee:我不太清楚你的问题是什么。请澄清,否则您的问题可能会被否决,甚至被关闭。到目前为止,您似乎希望我们调试您的代码。这不是S.O.的目的。而且Delphi调试器非常好而且方便,所以我建议您自己开始调试。Uwe的评论暗示你可能有一些一次性的错误。通过调试很容易找到这些。您可能还想了解有关参数的信息,所以对于任何整数数组,您只需要一个洗牌函数。上面的代码没有编译,所以我们无法尝试,看看它有什么问题。总是让可能回答问题的人尽可能容易地回答问题,这样他们就不必为了帮助你而跳过障碍。他们将宝贵的时间花在帮助上,如果你发布不可编译的代码,你只会浪费他们的时间。这意味着他们中的许多人不会倾向于帮助你,而转向其他更好回答的问题。谢谢你的回答。我想我让这件事变得比我需要的更困难了,但以下是我正在努力做的。有两个数组,HighNums[]值为25-225,增量为25。LowNums[]1-10具有两个值。我想分别洗牌。我很确定问题在于每个阵列的洗牌。我只是想找出另一种方法。(这是第一次在这里提问,谢谢你在《后法令》上的指点!)哇,非常感谢你。我还没有完全理解或实现我将致力于理解这段代码的对象。这给了我一个很好的起点!请随便问
procedure TForm1.Button1Click(Sender: TObject);
procedure DisplayArray(A: array of Integer);
var
i: Integer;
s: String;
begin
s := '[';
for i := low(A) to min(10, High(A)) do
s := s + A[i].ToString + ',';
s[Length(s)] := ']';
Memo1.Lines.Add(s);
end;
var
i: Integer;
Nums: array [1 .. 9000] of Integer;
begin
Memo1.Lines.Clear;
for i := low(Nums) to High(Nums) do
Nums[i] := i;
DisplayArray(Nums);
TArrayHelper.PermuteArray(Nums);
DisplayArray(Nums);
end;