Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 不能在不获得交叉和超出范围的值的情况下洗牌两个数组_Arrays_Delphi_Shuffle - Fatal编程技术网

Arrays 不能在不获得交叉和超出范围的值的情况下洗牌两个数组

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

我有两个数组要洗牌。下面您将看到声明和一个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
    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;