【发布时间】:2020-01-11 17:05:03
【问题描述】:
我有一个由列表列表表示的方形网格 - 例如:
grid = [[[9,3], [], [4]],
[[10, 1, 2], [], [11,5]],
[[8], [7, 6], []]]
最里面的列表(单元格)的长度没有限制。网格必须包含从 1 到 n 的所有整数,其中 n 是给定的数字(在本例中为 11),每个数字只能出现一次。
我需要以均匀的概率选择一个介于 1 和 n 之间的随机数并返回该数字的位置(即对于“3”,我需要 grid[0][0][1])。因为概率需要统一,所以我不能只选择一个随机单元格,然后在单元格中选择一个随机数,因为这会使选择偏向单元格中数字较少的单元格中的数字。
我最初的方法是生成一个介于 1 和 n 之间的随机数,然后在整个网格中查找该数字。但是,网格可以变得非常大。解决这个问题的最佳方法是什么?
【问题讨论】:
-
为什么
random.randint不够统一? “网格”如何影响选择的均匀性? -
这个“网格”是如何填充的,它代表什么?如果性能成为问题,最好使用不同的数据结构
-
@DeepSpace 我们还需要获取随机生成数字的位置
-
所以你的问题真的是“如何在嵌套结构中找到一个元素”,而不是“如何随机选择一个数字”,对吗?如果是,请编辑问题
-
because that would bias the selection towards numbers in cells with fewer numbers in them.,怎么样?只需为两个索引选择 2 个随机数(统一)。使用grid[index1][index2]转到索引,你会得到一个列表。现在,如果获得的列表不为空,则从列表中随机选择一个数字。整个过程需要恒定的时间(O(1))。