构建R包:“找到'rand',可能来自'rand'(C)”注意检查包装时

时间:2014-11-02 10:10:11

标签: c++ r rcpp cran

我正在构建一个包含C ++代码的R包。其中,我使用rand()函数。该软件包在我的Linux机器上进行检查和构建,没有任何异常。但是,当我尝试使用Windows builder检查Windows版本时,我收到以下警告:

* checking compiled code ... NOTE
File 'tagcloud/libs/i386/tagcloud.dll':
  Found 'rand', possibly from 'rand' (C)
    Object: 'overlap.o'
  Found 'srand', possibly from 'srand' (C)
    Object: 'overlap.o'
File 'tagcloud/libs/x64/tagcloud.dll':
  Found 'rand', possibly from 'rand' (C)
    Object: 'overlap.o'
  Found 'srand', possibly from 'srand' (C)
    Object: 'overlap.o'

Compiled code should not call entry points which might terminate R nor
write to stdout/stderr instead of to the console, nor the C RNG.

以下是一些示例代码:

#include "Rcpp.h"
#include <cstdlib>
#include <time.h>

using namespace Rcpp;

RcppExport SEXP test(  ) {
  double x ;
  srand( (unsigned) time(NULL) );
  x = rand();
  return( 1 );
}

我不理解有关rand()的抱怨。我也没有看到代码中的哪个部分“调用可能终止R的入口点”或“写入stdout / stderr”,但是,如果我删除了对rand / srand的调用,则此消息将消失。

Google在其检查日志中显示了许多似乎具有相同注意的软件包。你看到了吗?有没有办法可以摆脱它?

1 个答案:

答案 0 :(得分:3)

评论中的讨论已经达到了重点:R(最近)抱怨使用rand()srand()。 [请注意,这是一个R问题,而不是Rcpp问题。 ]

原因在于,在过去的某些时刻,rand()在某些系统上确实很糟糕。所以警告仍然存在。参见例如this page at cppreference.com

  

无法保证产生的随机序列的质量。在过去,rand()的一些实现在产生的序列的随机性,分布和周期方面存在严重的缺点(在一个众所周知的例子中,低阶位在调用之间简单地在1和0之间交替)。 p>      

rand()不建议用于严重的随机数生成需求,例如加密。建议使用C ++ 11的随机数生成工具来替换rand()。 (自C ++ 11起)

对于R和Rcpp软件包,没有任何理由依赖rand(),因为 R附带了几个高质量的生成器 。请参阅Writing R Extension手册,如何从C代码访问它们,以及众多 Rcpp示例(此处为Rcpp documtation,Rcpp Gallery),了解如何通过Rcpp从C ++访问它们。