我正在尝试在R中生成一组均匀分布的数字。我知道我们可以使用R中的"runif"函数来实现相同的功能。但我真的想了解开发这个函数背后的思想。也就是说,"runif"函数的代码如何工作。因此,简而言之,我想创建自己的函数,可以完成与"runif"相同的任务
我正在尝试在R中生成一组均匀分布的数字。我知道我们可以使用R中的"runif"函数来实现相同的功能。但我真的想了解开发这个函数背后的思想。也就是说,"runif"函数的代码如何工作。因此,简而言之,我想创建自己的函数,可以完成与"runif"相同的任务
最终,runif
调用一个伪随机数生成器。其中一种较简单的可以在 此处 找到,它是在 R 代码库中以 C 语言编写的,应该很容易模拟。
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) 范围内。