从数组中获取随机数

时间:2014-02-26 07:20:10

标签: 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。 希望这很清楚,如果不让我知道并且生病,试着更好地解释它

2 个答案:

答案 0 :(得分:2)

创建一个数组来保存索引:

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)];

旁白:

  1. 通常首选基于零的索引。它与RTL和现存的库更加一致。
  2. 数组a看起来很像它的元素应该是Boolean类型。
  3. 可以想象,构建a的代码可以直接在我的答案中构建Indices数组。如果您出于任何其他目的不需要a,那将更简单。

答案 1 :(得分:0)

采用动态数组整数来维护值为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。无需再次检查。     我希望这对你有用。