c++ - 来自两个列表的随机对

标签 c++ arrays algorithm random permutation

我的问题类似于this一个。

我有两个列表:带有 n 元素的 X 和带有 m 元素的 Y - 假设它们包含n x m 矩阵 A 的行索引和列索引。现在,我想向矩阵 A 中的 k 个随机位置写入一些内容。

我想到了两种解决方案:

  1. X获取随机元素x,从Y获取随机元素y。检查是否已将某些内容写入 A[x][y],如果没有,则写入。但如果 k 接近 m*n 我可以永远这样拍摄。
  2. 创建一个包含所有可能的索引组合的 m*n 数组,对其进行打乱,绘制前 k 元素并写入其中。但我在这里看到的问题是,如果 nm 都很大,则新创建的 n*m 数组可能是 巨大(并且洗牌也可能需要一些时间)。
  3. 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/

相关文章:

c++ - "Adapter"为成员变量

c++ - 查找下一个具有真值的数组索引 C++

python - 不同的 Numpy reshape 为 3D 数组语法

python - 高效统计 NumPy 中唯一子数组的出现次数?

algorithm - 将函数应用于 R 中的距离矩阵

c - 在 C 中优化搜索算法

c# - 如何使用 IPropertyNotifySink 触发从 C# 到 COM 的属性更改通知?

c++ - 为什么不推导模板参数?

arrays - 根据对象字段减少对象数组

algorithm - 填充操作在绘画应用程序中如何工作?