2013-04-08 125 views
-1

得到一個隨機值的方式,我從一維數組得到一個值是:從二維陣列

Random random = new Random(); 
getit = w[r.Next(0, w.Length)]; 

能否請你告訴我,我該怎麼做同樣的二維數組?

回答

4

假設你有一個簡單的二維陣列[,]不交錯數組[][],然後可以使用Array.GetLength method獲得每個維度的長度。例如:

Random random = new Random(); 
string[,] arr = new string[10, 10]; 

int i1 = r.Next(0, arr.GetLength(0)); 
int i2 = r.Next(0, arr.GetLength(1)); 
string value = arr[i1, i2]; 

)是可能的下界的多維陣列的是從0的默認在這種情況下不同,適當地使用Array.GetLowerBound method


如果你有鋸齒狀排列,而不是[][]不是一個真正的二維數組[,],那麼你就可以按順序做:

Random random = new Random(); 
string[][] arr = new string[][10]; 
for (int i = 0; i < arr.Length; i++) 
    arr[i] = new string[10]; 

int i1 = r.Next(0, arr.Length); 
string[] subarr = arr[i1]; 
int i2 = r.Next(0, subarr.Length); 
string value = subarr[i2]; 
8

要確保你有一個均勻分佈您不應該生成多個隨機數字。通過尺寸的長度乘以計算值的可能的總數,選擇一個指數,然後找到對應於該指數的一個項目:

public static T GetRandomValue<T>(T[,] array, Random random) 
{ 
    int values = array.GetLength(0) * array.GetLength(1); 
    int index = random.Next(values); 
    return array[index/array.GetLength(0), index % array.GetLength(0)]; 
} 
0

不是真的最快的方法,但你也可以這樣做用一點Linq:

var totalSize = Enumerable.Range(0, array.Rank).Aggregate(0, (l, r) => l * array.GetLength(r)); 
var getit = w.ElementAt(r.Next(0, totalSize)); 

這適用於任何維度的數組。

+0

這裏的問題是你將它從O(1)變成O(n),因爲你需要迭代數組來獲得它。哦,你想用'First',而不是'Take(1)'。他會想要一個項目,而不是一個大小的序列。 – Servy 2013-04-08 16:44:39

+0

@Servy我確實說過它不會是最快的方法。我至少將它改爲'ElementAt',它對於一維數組是O(1)。 – 2013-04-08 16:55:50