gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:02:53 26 4
gpt4 key购买 nike

我想用 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. 将数字 1 到 49 放入数组中。
  2. 对数组执行随机播放。
  3. 取出前 6 个元素。

这可能不是最有效的方法,但它易于实现、易于理解,而且最重要的是,易于推断采样方法的分布属性。

对于随机播放,请使用 Fisher-Yates洗牌。我用通用方法这样实现:

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;

哪里Uniform(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, 0, 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;

我应该说,我怀疑性能是否会成为这里的驱动因素。

关于delphi - 如何在 pascal 中生成彼此唯一的随机整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20361200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com