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

 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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值