我的问题类似于this一个。
我有两个列表:带有 n
元素的 X
和带有 m
元素的 Y
- 假设它们包含n x m
矩阵 A
的行索引和列索引。现在,我想向矩阵 A
中的 k
个随机位置写入一些内容。
我想到了两种解决方案:
- 从
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
有什么建议吗?
还有其他我错过的(更好的)方法吗?
最佳答案
有一个 elegant algorithm由于弗洛伊德(Floyd)对一系列整数进行不替换采样。您可以通过 C++ 函数 [m](int i) { return std::make_pair(i/m, i %) 将
.[0, n*m)
中的结果整数映射到坐标米); }
关于c++ - 来自两个列表的随机对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36179226/