从源数组中取不同的随机数

来源:互联网 发布:汉字转换拼音软件 编辑:程序博客网 时间:2024/05/04 01:55

 TArrayInt = Array Of Integer; //自定义整数数组

 

Function GetRandomIntArray(SrcArray: TArrayInt; Var DestArray: TArrayInt;
  CntDest: integer): Boolean;
Var
  i, j, lRnd, lCntSrc: integer;

Begin
  Try
    If CntDest <= 0 Then
      CntDest := high(SrcArray);

    lCntSrc := high(SrcArray);

    setlength(DestArray, CntDest);

    CntDest := CntDest - 1;

    For i := 0 To CntDest Do
      DestArray[i] := 0;

    {If lCntDest >= lCntSrc Then
      Begin
        For i := 0 To lCntSrc Do
          DestArray[i] := SrcArray[i];

        result := true;
        exit;
      End;
  }
    If CntDest > lCntSrc Then //个数相同作乱序处理
      CntDest := lCntSrc;

    {第一次从   SrcArray[0]   ~   SrcArray[lCntSrc]中任意选择一个数,作为第一个数;
    剔除此数,把最末一个数SrcArray[lCntSrc]添到这个位置;

    第二次从SrcArray[0]   ~   SrcArray[lCntSrc-1]中任意选择一个数,作为第二个数;
    剔除此数,把最末一个数SrcArray[lCntSrc-1]添到这个位置;}

    j := -1;
    For i := 0 To CntDest Do
      Begin
        lRnd := Random(lCntSrc + 1 - i);

        j := j + 1;
        DestArray[j] := SrcArray[lRnd];

        SrcArray[lRnd] := SrcArray[lCntSrc - i];
      End;

    result := true;
  Except
    On e: exception Do
      Begin
        Raise Exception.Create('uCommonOperate.GetRandomIntArray ' + e.Message);
      End;
  End;
End;