加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何在pascal中生成彼此唯一的随机整数

发布时间:2020-12-15 09:50:22 所属栏目:大数据 来源:网络整理
导读:我想在pascal中创建一个程序,在1到49之间选择6个随机整数.每个数字应该是唯一的,即你不能拥有’8,22’22’32’37’43’因为’22’被重复.如何我可以在Delphi中实现这个吗? 我可以使用以下代码在1 – 49之间获得6个随机数. for i := 1 to 6 do begin num[i]
我想在pascal中创建一个程序,在1到49之间选择6个随机整数.每个数字应该是唯一的,即你不能拥有’8,22’22’32’37’43’因为’22’被重复.如何我可以在Delphi中实现这个吗?

我可以使用以下代码在1 – 49之间获得6个随机数.

for i := 1 to 6 do
  begin 
    num[i] := random(49) + 1
  end
{next};

解决方法

我会这样做:

>将数字1到49放入数组中.
>在阵列上执行随机播放.
>拉出前6个元素.

它可能不是最有效的方法,但它易于实现,易于理解,最重要的是,易于推理您的采样方法的分布属性.

对于shuffle,请使用Fisher-Yates shuffle.我在这个泛型方法中实现了这个:

procedure TRandomNumberGenerator.Permute<T>(var Values: array of T);
var
  i,Count: Integer;
begin
  Count := Length(Values);
  for i := 0 to Count-2 do
    TGeneric.Swap<T>(Values[i],Values[i + Uniform(Count-i)]);
end;

统一(N)是我的RNG的函数,它返回从0..N-1上的均匀分布中提取的值.您可以在代码中将其替换为Random.并且TGeneric.Swap< T>交换这两个元素.

你可以修改它来处理一个整数数组,如下所示:

procedure Swap(var lhs,rhs: Integer);
var
  tmp: Integer;
begin
  tmp := lhs;
  lhs := rhs;
  rhs := tmp;
end;

procedure Permute(var Values: array of Integer);
var
  i,Count: Integer;
begin
  Count := Length(Values);
  for i := 0 to Count-2 do
    Swap(Values[i],Values[i + Random(Count-i)]);
end;

当然,你只需要执行循环的前六次迭代,所以一个非常有效的版本将是这样的:

function Choose(M,N: Integer): TArray<Integer>;
var
  i: Integer;
  Values: TArray<Integer>;
begin
  Assert(M>0);
  Assert(N>=M);

  SetLength(Values,N);
  for i := 0 to N-1 do
    Values[i] := i+1;

  for i := 0 to Min(M-1,N-2) do
    Swap(Values[i],Values[i + Random(N-i)]);

  Result := Copy(Values,M);
end;

你会称这传球6和49:

Values := Choose(6,49);

如果你是一个疯狂的表演怪胎,那么我认为很难打败这个:

type
  TArr6 = array [0..5] of Integer;
  PArr6 = ^TArr6;
  TArr49 = array [0..48] of Integer;

const
  OrderedArr49: TArr49 = (
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
  );

function Choose6: TArr6;
var
  i: Integer;
  Values: TArr49;
begin
  Values := OrderedArr49;
  for i := 0 to high(Result) do begin
    Swap(Values[i],Values[i + Random(Length(Values)-i)]);
  end;
  Result := PArr6(@Values)^;
end;

我应该说我怀疑性能是这里的驱动因素.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读