Delphi 从数组中获取随机数
我有一个数组Delphi 从数组中获取随机数,delphi,delphi-xe2,Delphi,Delphi Xe2,我有一个数组 a[1..5] : array of integer; 接下来我做一些检查,并将一些值设置为1 DoesSomeDataCheck() begin ... if True a[Count] = 1; ..... end 现在,让我们假设使数组值为: a[1] = 1; a[2] = 1; a[3] = 0; a[4] = 0; a[5] = 1; 现在我需要从所有=1的整数中随机得到一个。 不知道从哪里开始。。 但在这种情况下,它应该返回1,2,5。 如
a[1..5] : array of integer;
接下来我做一些检查,并将一些值设置为1
DoesSomeDataCheck()
begin
...
if True
a[Count] = 1;
.....
end
现在,让我们假设使数组值为:
a[1] = 1;
a[2] = 1;
a[3] = 0;
a[4] = 0;
a[5] = 1;
现在我需要从所有=1的整数中随机得到一个。
不知道从哪里开始。。
但在这种情况下,它应该返回1,2,5。
如果不让我知道,希望这是清楚的,我会尝试更好地解释它创建一个数组来保存索引:
var
Indices: array [1..5] of Integer;
以及一个变量,用于保存原始数组中值为1的索引数:
var
IndicesCount: Integer;
初始化:
IndicesCount := 0;
for i := 1 to 5 do
if a[i] = 1 then
begin
Inc(IndicesCount);
Indices[IndicesCount] := i;
end;
然后你可以随机抽样
Assert(IndicesCount>0);
Sample := Indices[1 + Random(IndicesCount)];
旁白:
a
看起来非常像它的元素应该是Boolean
类型李>
a
的代码可以直接构建我的答案中的索引
数组。如果您不需要a
用于任何其他目的,那么这会更简单李>
使用一个动态整数数组来维护值为1的索引
Var
indexArray : Array of Integer;
..........
将DoesSomeDataCheck()更改如下:
procedure DoesSomeDataCheck()
begin
...
if True
begin
a[Count] := 1;
setLength(indexArray, Length(indexArray)+1);
indexArray[Length(indexArray)-1] := Count;
end;
.....
end
现在,您可以随时使用indexArray。不用再查了。
我希望这对您有用。我决定不使用zerobased,因为1-5与我正在测试的数据一致。数组可以是布尔型的,我只是用整数做的,因为我认为这会更容易,是的,如果我检查的插槽/区域是空的,A只是保持1。David的代码保证会立即给你一个索引,代价是代码稍微复杂一些。如果你知道大多数数组值都是1,你可以重复i:=Random(5)+1,直到a[i]=1理论上这是不确定的,实际上我不知道代码中的错误在哪里,或者它与问题无关?这样我可以提高编码水平。。。