- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在努力将 MATLAB 模拟移植到 C++ 中。为此,我试图复制 MATLAB 的 randsample() function .我还没有想出一个有效的方法来做到这一点。
所以我问大家,在 C++ 中,如何最好地从 0:n-1(对于 n > k)范围内随机抽取 k 个数字而不进行替换?
我考虑过以下伪代码(灵感来自 cppreference.com 上的第三个示例),但我觉得它有点 hacky:
initialize vect<int> v of size n
for i = 0 to n-1
v[i] = i
shuffle v
return v[0 to k-1]
这里的缺点也是需要先构建一个庞大的数组。这似乎是缓慢/笨拙的矫枉过正。
如果您能提供帮助,我很乐意在这里提供一些指导。我对理论不太感兴趣(算法很有趣,但现在与我的需求不相关),我更感兴趣的是用 C++ 实现它的最佳方法。
提前致谢!
最佳答案
如果 N
很大但 k
不是,这里有一种方法不需要生成和洗牌一个巨大的列表:
std::vector<int> pick(int N, int k) {
std::random_device rd;
std::mt19937 gen(rd());
std::unordered_set<int> elems = pickSet(N, k, gen);
// ok, now we have a set of k elements. but now
// it's in a [unknown] deterministic order.
// so we have to shuffle it:
std::vector<int> result(elems.begin(), elems.end());
std::shuffle(result.begin(), result.end(), gen);
return result;
}
现在实现 pickSet
的简单方法是:
std::unordered_set<int> pickSet(int N, int k, std::mt19937& gen)
{
std::uniform_int_distribution<> dis(1, N);
std::unordered_set<int> elems;
while (elems.size() < k) {
elems.insert(dis(gen));
}
return elems;
}
但如果 k
相对于 N
较大,则该算法可能会导致大量冲突并且可能会非常慢。我们可以通过保证可以在每次插入时添加一个元素来做得更好(由 Robert Floyd 提供给您):
std::unordered_set<int> pickSet(int N, int k, std::mt19937& gen)
{
std::unordered_set<int> elems;
for (int r = N - k; r < N; ++r) {
int v = std::uniform_int_distribution<>(0, r)(gen);
// there are two cases.
// v is not in candidates ==> add it
// v is in candidates ==> well, r is definitely not, because
// this is the first iteration in the loop that we could've
// picked something that big.
if (!elems.insert(v).second) {
elems.insert(r);
}
}
return elems;
}
关于C++ 从 0 :n-1 (n > k) without replacement 范围内随机抽取 k 个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287138/
我有一个 float 组 Eigen::ArrayXf,我需要对其进行抽取(即从 f.i. 8 个样本中选择 1 个)。 Eigen::ArrayXf decimatedSignal = Eigen:
C:\Sites\dtr-payroll>rake assets:precompile rake aborted! You have already activated rake 10.0.4, bu
有谁知道使用什么特定函数来确定 decimate(vector, order, 'fir') 中的滤波器系数?具体来说是 fir1 和 Wn = 0.5 吗?上面写着订单是30,所以这是肯定的。我得到
我正在设置 Ruby on Rails 生产环境。我正在使用 RVM 的多用户安装。运行 rake assets:precompile 时出现以下错误。其他 rake 任务似乎工作正常。 ruby@m
我敢肯定一定有一些简单的方法,例如仅提取以光标开头的内部上下文部分,但未找到任何内容。例如 fcn(arg1, arg2, fcn2(x, y), arg4) ^-curs
两个问题:1) 如何获得 rake assets:precompile 以使用我的 application.css 中的 CSS3 动画? 在 application.css 中: @-webkit-
我正在部署到 heroku,但我发现没有提供 css 文件(在 heroku 上也找不到它们)。 我读到我需要首先在本地执行 rake assets:precompile 但是当我这样做时我得到: C
我想知道在 vi 编辑器中使用缓冲区从文件 1 复制数据并将数据粘贴到文件 2 的过程。 你能告诉我一步一步的过程吗? 怎么做? 最佳答案 来自 vi 手册: 6.5.6.3 Using Named
在我托管在 digital ocean 上的生产服务器上,如果有帮助的话,Ubuntu 12.04,我有 RoR 4 和 rake 10.1.1。 当我部署时,我运行 rake assets:prec
所以我在这上面花了一天时间,阅读了每一个 SO 问题,甚至是稍微相关的问题,并检查了 Heroku 文档。 这是推送时的 Heroku 问题: -----> Preparing app for Rai
我是一名优秀的程序员,十分优秀!