【问题标题】:How to compare a function written in two different programming languages [closed]如何比较用两种不同编程语言编写的函数[关闭]
【发布时间】:2021-07-26 02:39:17
【问题描述】:

我有一个使用 R 编写的函数,后来还创建了一个 C++ 版本。我想评估这两个函数是否产生相同的结果。

该函数生成随机数,因此需要在同一种子下进行比较。

这可以比较用 2 种不同语言编写的函数吗?

【问题讨论】:

  • 给出输入并检查输出是否相同,并不是检查两个函数是否相同的好方法
  • @Berto99:这不是一个坏方法,特别是如果原件是一个黑盒子。见test oracle。结合模糊测试,它可以非常有效(一如既往,如果您了解您的领域,您可以设计更多的单元测试)。
  • 能否在调用每个函数之前不设置种子并缓存每个函数的结果?然后做identical(res1, res2)
  • @AndyG 是的,它增加了概率,但不证明任何东西......但如果我们无法证明这两个函数是相同的,这是你描述的最好的方法跨度>

标签: c++ r random rcpp seed


【解决方案1】:

最初的问题没有明确说明:究竟你需要做什么?

我们确实为您提供相同的随机抽奖,见证这一点:

> library(Rcpp)
> set.seed(42); runif(2); rnorm(2)
[1] 0.914806 0.937075
[1] -0.564698  0.363128
> Rcpp::cppFunction("NumericVector myrunif(int n) { return Rcpp::runif(2); }")
> Rcpp::cppFunction("NumericVector myrnorm(int n) { return Rcpp::rnorm(2); }")
> set.seed(42); myrunif(2); myrnorm(2)
[1] 0.914806 0.937075
[1] -0.564698  0.363128
> 

不是 U(0,1) 和 N(0,1) 绘制是相同的因为 Rcpp 访问相同的底层 RNG 流作为 R。

【讨论】:

    【解决方案2】:

    你想在 R 中测试的函数,可以从 C++ 中以相当简单的方式调用 (Rcpp)

    下面是一些伪代码。

    // [[Rcpp::export]]
    NumericVector GetRSideRandomValue(){
    
        // calling R function() -- randNumOnR
        Function f("randNumOnR");   
    
        // Return result.
        return f();
    }
    

    在c++端可以直接调用GetRSideRandomValue

    然后比较值。

    【讨论】:

    • 事实上,这似乎是我所做的。我正在使用 Rcpp 调用 C++ 函数,并在 R 中以相同的种子运行我的函数。但是,我得到了一组不同的数字。你能详细说明你在 C++ 函数中调用 R 函数的部分吗?
    • 你为什么要这样做?为什么不直接从 R 调用 R 函数,然后通过 Rcpp 将 C++ 导出到 R,然后同时调用两者?我们在 StackOverflow 上可能有一千个 Rcpp 答案中使用了完全相同的模式。
    • @DirkEddelbuettel 是的,另一种方式也可以。但取决于测试台使用哪种编程语言。
    • @DirkEddelbuettel 基本上在set.seed() 之后,我同时调用了R 函数和C++ 函数。但它不起作用(根据不同的随机数集给出不同的结果)。我不确定我是否理解这是否是您要求做的。
    • @Rel_Ai 我们需要minimally complete verifiable example 来帮助您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2016-02-20
    • 2014-02-11
    • 2020-08-23
    相关资源
    最近更新 更多