如何随机选择范围内的所有数字?

时间:2013-03-08 05:41:35

标签: delphi list pascal

在pascal中,我想随机选择1到50之间的循环数。每次选择一个数字时,该数字将被删除,直到1到50之间最终没有数字可供选择,并且循环结束。

如何在Pascal / Delphi中完成这样的事情?

1 个答案:

答案 0 :(得分:5)

这一定很容易。

  1. 您从1到50的数字数组开始
  2. 在每次迭代中,您选择1和数组元素数之间的随机数
  3. 您从阵列中获取该元素
  4. 转到第2步,直到阵列中没有剩余元素。
  5. 在代码中,它看起来像这样:

    program Project1;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils;
    
    const
      ARRAY_ELEMENTS = 50;
    
    var
      SourceArray: array of Integer;
      Element: Integer;
      ValidElements: Integer;
    begin
      Randomize;
      try
        //array initialization
        SetLength(SourceArray, ARRAY_ELEMENTS);
        for Element := Low(SourceArray) to High(SourceArray) do
          SourceArray[Element] := Element + 1;
        ValidElements := ARRAY_ELEMENTS;
        repeat
          //select a random element
          Element := Random(ValidElements);
          Writeln(SourceArray[Element]);
          //remove the element from the array
          SourceArray[Element] := SourceArray[ValidElements - 1];
          Dec(ValidElements);
        until ValidElements = 0;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      readln;
    end.
    
    评论后

    编辑以通过将最后一个数组元素与戳戳的数组交换来提高性能。

    列表示例

    我没有注意到您的标记,所以这是一个列表示例:

    program Project1;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils,
      Generics.Collections;
    
    const
      LIST_ELEMENTS = 50;
    
    var
      I: Integer;
      Element: Integer;
      SourceList: TList<Integer>;
    begin
      Randomize;
      try
        SourceList := TList<Integer>.Create();
        try
          for I := 1 to LIST_ELEMENTS do
            SourceList.Add(I);
          repeat
            Element := Random(SourceList.Count);
            Writeln(SourceList[Element]);
            SourceList.Delete(Element);
          until SourceList.Count = 0;
        finally
          SourceList.Free;
        end;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      readln;
    end.