2014-02-26 117 views
1

我有一個數組獲取隨機數從數組

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 不知道w ^這裏甚至開始這個.. 但它應該返回1,2,5在這種情況下。 希望這是明確的,如果不是讓我知道和虐待試圖解釋它更好

回答

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用於其他目的,那會更簡單。
+0

我決定不使用zerobased,只是導致1-5與我正在測試的數據一致。數組可以是布爾值,我只是用整數做的,因爲我認爲它會更容易,是的,如果我檢查的插槽/區域是空的,A只是保持1。 –

+0

大衛的代碼保證以稍微複雜的代碼價格立即給你一個你的指數。如果你知道大部分數組值是1,你可以重複i:= Random(5)+1,直到a [i] = 1理論上這可能是未定的,實際上它不是 –

+0

很好用!再次感謝 –

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時你想要的。無需再次檢查。 我希望這對你有用。

+0

我可以知道我的代碼中的錯誤或者與問題無關嗎?這樣我可以提高編碼水平... –