"runif" 函数如何在 R 内部工作?
How does "runif" function work internally in R?
我正在尝试在 R 中生成一组均匀分布的数字。我知道我们可以使用 R 中的函数“runif”来做同样的事情。但我真的很想了解如何开发此功能背后的想法。从某种意义上说,代码如何为函数“runif”工作。所以,简而言之,我想创建自己的函数,它可以完成与“runif”相同的任务
最终,runif
调用伪随机数生成器。可以在 R 代码库中的 C 中找到一个更简单的 here 定义,应该可以直接模拟
static unsigned int I1=1234, I2=5678;
void set_seed(unsigned int i1, unsigned int i2)
{
I1 = i1; I2 = i2;
}
void get_seed(unsigned int *i1, unsigned int *i2)
{
*i1 = I1; *i2 = I2;
}
double unif_rand(void)
{
I1= 36969*(I1 & 0177777) + (I1>>16);
I2= 18000*(I2 & 0177777) + (I2>>16);
return ((I1 << 16)^(I2 & 0177777)) * 2.328306437080797e-10; /* in [0,1) */
}
如此有效,这采用初始整数种子值,按位打乱它们,然后通过乘以一个小常数将它们重新转换为双精度浮点数,该常数将双精度归一化到 [0, 1) 范围内。
我正在尝试在 R 中生成一组均匀分布的数字。我知道我们可以使用 R 中的函数“runif”来做同样的事情。但我真的很想了解如何开发此功能背后的想法。从某种意义上说,代码如何为函数“runif”工作。所以,简而言之,我想创建自己的函数,它可以完成与“runif”相同的任务
最终,runif
调用伪随机数生成器。可以在 R 代码库中的 C 中找到一个更简单的 here 定义,应该可以直接模拟
static unsigned int I1=1234, I2=5678;
void set_seed(unsigned int i1, unsigned int i2)
{
I1 = i1; I2 = i2;
}
void get_seed(unsigned int *i1, unsigned int *i2)
{
*i1 = I1; *i2 = I2;
}
double unif_rand(void)
{
I1= 36969*(I1 & 0177777) + (I1>>16);
I2= 18000*(I2 & 0177777) + (I2>>16);
return ((I1 << 16)^(I2 & 0177777)) * 2.328306437080797e-10; /* in [0,1) */
}
如此有效,这采用初始整数种子值,按位打乱它们,然后通过乘以一个小常数将它们重新转换为双精度浮点数,该常数将双精度归一化到 [0, 1) 范围内。