我正在构建一个包含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在其检查日志中显示了许多似乎具有相同注意的软件包。你看到了吗?有没有办法可以摆脱它?
答案 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 ++访问它们。