Building R package: quot;Found #39;rand#39;, possibly from #39;rand#39; (C)quot; NOTE when checking package(构建R包:qot;找到rand39;,可能来自#39;rand39;(C)qot;检查包时注意)
问题描述
我正在构建一个包含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显示了许多包,它们的检查日志中似乎有相同的注释。你看过吗?我有办法摆脱它吗?
推荐答案
评论中的讨论已经触及要点:R(最近)抱怨rand()和srand()的使用。[请注意,这是R问题,而不是RCPP问题。]
理由是,在过去的某些时候,rand()在某些系统上确实很糟糕。因此,警告依然存在。参见例如this page at cppreference.com:
不能保证所产生的随机序列的质量。在过去,rand()的一些实现在产生的序列的随机性、分布和周期方面存在严重缺陷(在一个众所周知的例子中,低位在调用之间简单地在1和0之间交替)。 不建议将rand()用于严重的随机数生成需求,如密码学。建议使用C++11的随机数生成工具来代替rand()。(从C++11开始)
对于R和RCPP包,没有任何理由依赖rand(),因为R附带了几个高质量的生成器。请参阅编写R扩展手册如何从C代码访问它们,以及有关如何从C++通过RCPP访问它们的大量RCPP示例(此处为RCPP文档、RCPP库)。
这篇关于构建R包:&qot;找到&rand&39;,可能来自';rand&39;(C)&qot;检查包时注意的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:构建R包:&qot;找到&rand&39;,可能来自';rand&39;(C)&qot;检查包时注意
基础教程推荐
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- CString 到 char* 2021-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
