得到一個隨機值的方式,我從一維數組得到一個值是:從二維陣列
Random random = new Random();
getit = w[r.Next(0, w.Length)];
能否請你告訴我,我該怎麼做同樣的二維數組?
得到一個隨機值的方式,我從一維數組得到一個值是:從二維陣列
Random random = new Random();
getit = w[r.Next(0, w.Length)];
能否請你告訴我,我該怎麼做同樣的二維數組?
假設你有一個簡單的二維陣列[,]
,不交錯數組[][]
,然後可以使用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];
要確保你有一個均勻分佈您不應該生成多個隨機數字。通過尺寸的長度乘以計算值的可能的總數,選擇一個指數,然後找到對應於該指數的一個項目:
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)];
}
不是真的最快的方法,但你也可以這樣做用一點Linq:
var totalSize = Enumerable.Range(0, array.Rank).Aggregate(0, (l, r) => l * array.GetLength(r));
var getit = w.ElementAt(r.Next(0, totalSize));
這適用於任何維度的數組。
這裏的問題是你將它從O(1)變成O(n),因爲你需要迭代數組來獲得它。哦,你想用'First',而不是'Take(1)'。他會想要一個項目,而不是一個大小的序列。 – Servy 2013-04-08 16:44:39
@Servy我確實說過它不會是最快的方法。我至少將它改爲'ElementAt',它對於一維數組是O(1)。 – 2013-04-08 16:55:50