Пакет Building R: & quot; Найден ‘rand’, возможно, из ‘rand’ (C) & quot; ПРИМЕЧАНИЕ при проверке пакета

Я строю пакет R, который содержит код C ++. Среди прочего я использую функцию rand (). Пакет проверяется и собирается без каких-либо нарушений на моей машине с Linux. Тем не менее, когда я пытаюсь проверить сборку Windows, используя Windows Builder, Я получаю следующее предупреждение:

* 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 показывает много пакетов, которые, кажется, имеют одинаковое ПРИМЕЧАНИЕ в своих журналах проверок. Вы видели это? Есть ли способ, которым я могу избавиться от этого?

3

Решение

Обсуждение в комментариях уже затрагивает существенный момент: R (в последнее время) жалуется на использование rand() а также srand(), [Обратите внимание, что это проблема R, а не проблема Rcpp. ]

Причина в том, что в некоторые моменты в прошлом rand() было действительно плохо на некоторых системах. Так что предупреждения сохраняются. Смотрите, например, из эта страница на cppreference.com:

Нет никаких гарантий относительно качества полученной случайной последовательности. В прошлом некоторые реализации rand () имели серьезные недостатки в случайности, распределении и периоде создаваемой последовательности (в одном хорошо известном примере бит младшего разряда просто чередовался между 1 и 0 между вызовами).

rand () не рекомендуется для серьезных задач генерации случайных чисел, таких как криптография. Для замены rand () рекомендуется использовать средства генерации случайных чисел в C ++ 11. (начиная с C ++ 11)

В случае пакетов R и Rcpp вы нет никаких оснований полагаться на rand() как R поставляется с несколькими высококачественными генераторами. Пожалуйста, обратитесь к руководству Writing R Extension, чтобы получить к ним доступ из кода C, и многочисленные Примеры Rcpp (здесь, документация Rcpp, Галерея Rcpp) о том, как получить к ним доступ из C ++ через Rcpp.

3

Другие решения


По вопросам рекламы [email protected]