Учитывая, что следующие эквиваленты, мы можем заключить, что R использует ту же функцию C runif для генерации однородных выборок для sample() и runif()...
set.seed(1)
sample(1000,10,replace=TRUE)
#[1] 27 38 58 91 21 90 95 67 63 7
set.seed(1)
ceiling( runif(10) * 1000 )
#[1] 27 38 58 91 21 90 95 67 63 7
Однако они не эквивалентны при работе с большими числами (n > 2^32 - 1):
set.seed(1)
ceiling( runif(1e1) * as.numeric(10^12) )
#[1] 265508663143 372123899637 572853363352 908207789995 201681931038 898389684968
#[7] 944675268606 660797792487 629114043899 61786270468
set.seed(1)
sample( as.numeric(10^12) , 1e1 , replace = TRUE )
#[1] 2655086629 5728533837 2016819388 9446752865 6291140337 2059745544 6870228465
#[8] 7698414177 7176185248 3800351852
Update
Как @Arun указывает 1-й, 3-й, 5-й,... из runif() приблизительный результат 1-го, 2-го, 3-го... от sample().
Оказывается, что обе функции вызывают unif_rand() за кулисами, однако sample, учитывая аргумент, n, который больше, чем наибольшее представляемое целое число типа "integer", но представляемое как целое число как тип "numeric" использует это статическое определение для рисования случайного отклонения (в отличие от просто unif_rand(), как в случае runif())...
static R_INLINE double ru()
{
double U = 33554432.0;
return (floor(U*unif_rand()) + unif_rand())/U;
}
С загадочной записью в документах, которые...
Два случайных числа используются для обеспечения равномерной выборки больших целых чисел.
-
Почему два случайных числа необходимы для обеспечения равномерной выборки больших целые числа?
-
Что такое константа
Uдля и почему она принимает конкретное значение33554432.0?