【发布时间】:2016-07-10 19:21:00
【问题描述】:
我的问题类似于this 一个。
我有两个列表:X 和 n 元素和 Y 和 m 元素 - 假设它们包含 n x m 矩阵 A 的行和列索引。现在,我想给k 矩阵A 中的随机位置写一些东西。
我想到了两个解决方案:
- 从
X获取随机元素x,从Y获取随机元素y。检查是否已将某些内容写入A[x][y],如果没有,请写入。但如果k接近m*n,我可以永远这样拍。 - 创建一个包含所有可能的索引组合的
m*n数组,将其随机排列,首先绘制k元素并在那里写入。但我在这里看到的问题是,如果n和m都非常大,那么新创建的n*m数组可能巨大(并且洗牌也可能需要一些时间)。李> -
Karoly Horvath 建议将两者结合起来。我想我必须选择阈值
t并且:
.
if( k/(m*n) > t ){
use option 2.
}else{
use option 1.
}
关于如何选择t 有什么建议吗?
还有其他我错过的(更好的)方法吗?
【问题讨论】:
-
如果您在开始采样之前知道 k,那将有很大的不同。如果这样做,您可以获得 k 个样本或 n*m-k,以较小者为准。或者您可以对大 k 使用水库采样。
标签: c++ arrays algorithm random permutation