繁体   English   中英

从二维数组获取随机值

[英]Get a random value from a two dimensional array

我从一维数组中获取值的方式是:

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

你能告诉我如何对二维数组做同样的事情吗?

为了确保分布均匀,您不应生成多个随机数。 通过乘以维度的长度来计算值的总数,选择一个索引,然后找到与该索引对应的一项:

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

假设您有一个简单的二维数组[,] 1而不是锯齿状的数组[][] ,则可以使用Array.GetLength方法获取每个数组维度的长度。 例如:

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

1 )多维数组的下限可能不同于默认值0。在这种情况下,请适当地使用Array.GetLowerBound方法


如果您有一个锯齿状数组而不是[][]而不是真正的二维数组[,] ,那么可以按顺序进行:

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

并不是真正最快的方法,但是您也可以使用一点Linq来做到这一点:

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

这适用于任何尺寸的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM