【发布时间】:2022-01-06 23:07:01
【问题描述】:
您通常会使用两个 for 循环遍历二维数组:
For i = 0 to 5
For j = 0 to 5
Console.Writeline(Arr(i,j))
Next
Next
我需要遍历一个 2D 数组(带有方形边 - 两边的长度相同,即 5x5 7x7 等),但我需要完全随机进行,并且不能重复相同的元素。
For Each i In iRandArr
For Each j In jRandArr
Console.Writeline(arr(iRandArr(j), jRandArr(i)))
Next
Next
'note: the elements i and j are swapped round above in order to maintain the "column", "row" nomenclature
我已经尝试通过将每一边的长度推到一个列表中,将其随机化(即取消排序,参见here),然后以相同的双循环方式迭代。不幸的是,这种方法不是随机迭代,而是通过选择随机“列”并随机迭代“行”来进行半随机迭代。唯一的问题是迭代受列元素的限制,因此不是真正随机的(在编程意义上)。
有没有人可以尝试任何其他可能的选择?
【问题讨论】:
-
如何通过构建一组覆盖 2D 数组的所有 XY 点,将 1D 点列表随机化,然后迭代随机化的 1D 列表,将 2D 问题分解为 1D 问题?
-
限制重复也不是真正随机的(在编程意义上)。在实际的随机数中,重复经常发生。因此,通过不允许重复,您根本不会随机迭代。
-
@KenWhite - 这是随机选择,没有替换。
-
@SeanSkelly 不幸的是,这会起作用,但是数组的格式不起作用,因为在数组外部迭代时会发生 IndexOutOfBounds 错误。
-
作为提供的两个答案的附录,您可能需要查找 Fisher-Yates shuffle 作为 Linq order-by-random 的替代方法。
标签: vb.net for-loop multidimensional-array iteration