c++ - 从 C++ 中的两个相关 vector 进行随机选择的最快方法是什么?

标签 c++ multidimensional-array vector shuffle

我想做的是打乱现有数组( vector )。这里有一个问题,实际上有两个数组( vector )相互依赖。

更确切地说,我有一个包含模式的二维 vector ,因此每一行表示一个模式,然后还有另一个二维 vector ,其中包含每个模式的所需输出。

所以它看起来像这样:

vector<vector<float>> P{ vector < float > {0, 0},
                         vector < float > {1, 0},
                         vector < float > {0, 1},
                         vector < float > {1, 1} };

vector<vector<float>> T{ vector < float > {0},
                         vector < float > {1},
                         vector < float > {1},
                         vector < float > {0} };

现在我需要打乱模式集合,所以每次我们遍历 P 时它们各自的行顺序都不同。我的意思是,因为这里 P 的 size() 是 4,因此我们有 4 个模式,我们想选择一个一次,直到我们访问所有这些。

当所有的模式都被一个接一个地选中时,一个epoch就完成了,我们需要改变下一个epoch的模式顺序。我们将这样做任意次数,并且每次都需要更改这些模式顺序,(例如,第一次 (0,0) 是第一个,然后是 (0,1) 和 (1,0 ) 最后是 (1,1),在第二个 epoch 中,我们可能将 (1,1) (1,0) (0,0) (0,1) 作为模式。

因此,当我们打乱模式集合时,我们也需要对目标集合进行完全相同的打乱。这样做最快的方法是什么?我脑子里闪过各种不同的方法,例如:

  • 从这两个数组中创建一个映射,并将每个模式映射到相应的目标,然后打乱模式集合。每当需要目标时,都可以通过 map 轻松访问。

  • 使用元组创建新列表并打乱新创建的元组并开始。

  • 只需使用 0 到 3 之间的随机数并选择一个数字(模式索引)并使用它,将索引存储在一个数组中,该数组用于防止在一个时期内选择相同的索引两次。

在这种情况下,您有什么建议?

最佳答案

看来你想打乱索引:

std::vector<std::size_t> indexes{0, 1, 2, 3}; // or initialize with std::iota

std::shuffle(indexes.begin(), indexes.end(), my_random_generator);

关于c++ - 从 C++ 中的两个相关 vector 进行随机选择的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32582628/

相关文章:

python - Python numpy 中的无循环卡方网格搜索

java - 逐列打印二维数组

c++ - 将 vector<vector<Point>> X 转换为 IplImage* 或 cv::Mat*

c++ - 如何将 vector 拆分为 n 个 "almost equal"部分

c++ - Eclipse自动在main方法处加断点

c++ - 如何对 Mandelbrot 集执行简单缩放

c++ - QLineEdit::setInputMask( const QString &mask ) - 不起作用

c - 将多维数组传递给函数

c++ - 我使用的是哪个版本的 C++?

c++ - 进程返回 139 (0x8B) 段错误