C++ 从 0:n-1 (n > k) 范围内随机采样 k 个数字,无需放回

2024-04-05

我正在致力于将 MATLAB 模拟移植到 C++ 中。为此,我尝试复制 MATLABrandsample() 函数 http://www.mathworks.com/help/stats/randsample.html。我还没有找到有效的方法来做到这一点。

所以我问大家,如何在 C++ 中最好地从 0:n-1(对于 n > k)范围内随机采样 k 个数字而不进行替换?

我考虑了以下伪代码(受到第三个示例的启发cppreference.com http://en.cppreference.com/w/cpp/algorithm/random_shuffle),但我觉得这有点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 is not:

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 is:

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;
}

But if k相对于N,该算法可能会导致大量冲突,并且速度可能相当慢。我们可以做得更好,保证我们可以在每次插入时添加一个元素(由罗伯特·弗洛伊德 http://www.nowherenearithaca.com/2013/05/robert-floyds-tiny-and-beautiful.html):

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 从 0:n-1 (n > k) 范围内随机采样 k 个数字,无需放回 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • Application Insights 未在 Azure 预览门户中显示数据

    我在 Azure 上有一个现有的 Web 应用程序 其中有一些非常有限的应用程序洞察监控 端点检查 我想我会引入其余的功能 所以我按照以下说明将遥测添加到我的项目中http azure microsoft com en us documen
  • 如何将 Visual Studio 2010 SP1 解决方案转换为 Visual Studio 2012 解决方案? [复制]

    这个问题在这里已经有答案了 我知道它们 大多数项目类型 在 2010 SP1 和 2012 之间是相互兼容的 并且没有必要进行转换 但是如果我仍然需要它怎么办 如果我需要将我的解决方案标记为 Visual Studio 2012 解决方案该
  • 在 Xcode 中使用 git 时 UserInterfaceState.xcuserstate 未提交

    当我尝试提交代码项目时 它显示一个名为 UserInterfaceState xcuserstate 的文件 必须提交该文件 一旦我提交并尝试将我的项目推送到 git Xcode 就会弹出一条消息 提示 工作副本 app 有未提交的更改 当
  • 使用 bxslider 时图像上没有箭头

    我刚刚了解了 bxslider 并通过阅读文档制作了我的第一个幻灯片 但我看不到图像上的左右箭头 因此可以通过单击显示下一张图像如以下示例所示 这个链接 http bxslider com examples image slideshow
  • 我怎样才能为基础 R 做出小小的贡献?

    偶尔我会看到一些可以改进 R 最近是 IQR 命令 和 R 文档 就在本周可能会详细说明aggregate tapply 和 by 之间的差异以及更好地互连 的小方法 但我看不出有什么办法可以真正回报这一贡献 我查看了开发人员网站 似乎我的
  • PHP SQL数据库查询错误信息

    这段SQL代码有什么问题吗 我从教程中得到它 但它返回以下错误消息 数据库查询失败 您有一个 SQL 语法错误 检查 与您的 MySQL 对应的手册 服务器版本的正确语法 在第 1 行 LIMIT 1 附近使用 function get s
  • 使用 python 将 tsv 文件转换为 xls/xlsx

    我想将 tsv 格式的文件转换为 xls xlsx 我尝试使用 os rename sample tsv sample xlsx 但转换后的文件已损坏 还有其他方法吗 这是一个使用 TSV 转换为 XLSX 的简单示例XlsxWriter
  • Android - 使用应用程序上下文创建 WebView 后如何将其附加到 Activity

    我正在使用应用程序上下文在后台创建一个 Android WebView 以便在我需要显示它时加载并准备好它 当需要时 我使用 addView 将其附加到我的 Activity 中 这通常工作得很好 但是当我尝试打开 HTML 选择下拉列表时
  • 将文本输入滑动窗口并进行计数

    我有这样的文件 超过 1 个缺少行 20 14370 rs6054257 G A 29 PASS NS 3 DP 14 AF 0 5 DB H2 GT GQ DP HQ 0 0 48 1 51 51 20 17330 T A 3 q10 N
  • 通过点击表格行触发jquery

    我喜欢在表格中有一行使其可点击 而不仅仅是行中的文本 因此我使用以下代码使其打开另一个页面 td 但是现在我使用 jquery 和下面的代码在 div 中而不是在新页面中打开新页面 我将如何更新我的行代码以打开 div 中的内容而不是在新页
  • mod_rewrite 用名称替换 ID

    我的网站上有一个动态显示内容的页面 网址结构是mywebsite com giveaway giveaway php id any number 我希望将该动态 URL 更改为静态 友好 URLmywebsite com giveaway
  • PageNumberPagination 和没有固定顺序的查询集

    根据文档 http www django rest framework org api guide pagination pagenumberpagination 当使用继承自的类时 无需任何特殊即可启用分页GenericAPIView 我
  • 使用 ajax 发布时的 net::ERR_EMPTY_RESPONSE

    你好 我正在尝试逐个上传 xlsx 文件 以便我可以显示状态栏 问题是 我使用 for 循环和 while 循环通过 ajax 发送请求来做到这一点 但是当位于第 40 个元素时 它会停止并且控制台显示 POST site php net
  • Android:当片段更改时如何重新创建操作栏

    我有一个活动显示一些片段 Activity 视图仅包含使用自定义 FragmentPagerAdapter 初始化的 ViewPager 该适配器提供 3 个片段之间的导航 除了操作栏之外 一切似乎都工作正常 我在片段中重写 onCreat
  • Chrome 扩展:每个选项卡的存储空间

    我想将扩展的状态存储在单个文件中而不是存储在单个文件中chrome storage但每个选项卡 扩展是关于在任何页面上制作网格系统覆盖 并希望存储每个选项卡的最新更新 这里是一些代码 popup js function let gridTo
  • Android 中触摸时可以模糊部分图像吗?

    我想模糊图像视图上的特定区域 例如 我想允许用户在android中绘制类似于裁剪的矩形 一旦用户在图像上绘制该矩形 矩形内的区域将变得模糊 或手指触摸 我搜索了很多 但大多数示例都解释了如何模糊完整图像 找不到任何解释如何仅模糊某些部分的教
  • php preg_grep 和元音变音/重音

    我有一个由术语组成的数组 其中一些包含重音字符 我像这样做了 preg grep data array Napol on Caf result preg grep input i data 因此 如果用户输入 le 我还希望结果 Napol
  • Visual Studio打开文件问题

    是否可以在 Visual Studio 2008 中打开项目 而不打开上次打开项目时先前打开的所有文件 我习惯在处理许多文件时保持打开状态 因此下次我打开项目时 它 非常缓慢 将一堆文件加载到编辑器中 我什至可能不需要打开它们 我已经搜索了
  • 如何减少 UNIX telnet 连接超时

    我有一个 unix shell 脚本 用于测试文件中列出的多个主机的 ftp 端口 for i in cat ftp hosts txt do echo QUIT telnet i 21 done 一般来说 这个脚本可以工作 但是如果我遇到
  • C++ 从 0:n-1 (n > k) 范围内随机采样 k 个数字,无需放回

    我正在致力于将 MATLAB 模拟移植到 C 中 为此 我尝试复制 MATLABrandsample 函数 http www mathworks com help stats randsample html 我还没有找到有效的方法来做到这一