Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从数组中获取随机数_Delphi_Delphi Xe2 - Fatal编程技术网

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

旁白:

  • 通常首选基于零的索引。它与RTL和现有库更加一致
  • 数组
    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理论上这是不确定的,实际上我不知道代码中的错误在哪里,或者它与问题无关?这样我可以提高编码水平。。。