当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R Random.user 用户提供的随机数生成


R语言 Random.user 位于 base 包(package)。

说明

函数RNGkind 允许提供user-coded 均匀和正态随机数生成器。详细信息请参见此处。

细节

从 dynamically-loaded 编译代码中的入口点调用用户指定的统一 RNG。用户必须提供入口点 user_unif_rand ,该入口点不带参数并返回指向双精度型的指针。下面的示例将显示一般模式。生成器应至少具有 25 位精度。

或者,用户可以提供入口点 user_unif_init ,在调用 RNGkind (或 set.seed )时使用 unsigned int 参数调用该入口点,并用于初始化用户的 RNG 代码。该参数旨在用于设置‘seeds’;它是 set.seedseed 参数,或者如果调用 RNGkind 则本质上是随机种子。

如果仅提供这些函数,则不会在中记录有关生成器状态的信息.Random.seed。可选,函数user_unif_nseeduser_unif_seedloc可以提供不带参数的调用,并且应该返回指向种子数量和整数的指针(具体来说,‘⁠Int32⁠’)种子数组。调用GetRNGstatePutRNGstate然后将这个数组复制到或从.Random.seed.

用户指定的普通 RNG 由单个入口点 user_norm_rand 指定,该入口点不带参数并返回指向双精度的指针。

警告

与所有已编译的代码一样,错误指定这些函数可能会崩溃R。一定要包括‘R_ext/Random.h’用于类型检查的头文件。

例子

## Not run: 
##  Marsaglia's congruential PRNG
#include <R_ext/Random.h>

static Int32 seed;
static double res;
static int nseed = 1;

double * user_unif_rand(void)
{
    seed = 69069 * seed + 1;
    res = seed * 2.32830643653869e-10;
    return &res;
}

void  user_unif_init(Int32 seed_in) { seed = seed_in; }
int * user_unif_nseed(void) { return &nseed; }
int * user_unif_seedloc(void) { return (int *) &seed; }

/*  ratio-of-uniforms for normal  */
#include <math.h>
static double x;

double * user_norm_rand(void)
{
    double u, v, z;
    do {
        u = unif_rand();
        v = 0.857764 * (2. * unif_rand() - 1);
        x = v/u; z = 0.25 * x * x;
        if (z < 1. - u) break;
        if (z > 0.259/u + 0.35) continue;
    } while (z > -log(u));
    return &x;
}

## Use under Unix:
R CMD SHLIB urand.c
R
> dyn.load("urand.so")
> RNGkind("user")
> runif(10)
> .Random.seed
> RNGkind(, "user")
> rnorm(10)
> RNGkind()
[1] "user-supplied" "user-supplied"

## End(Not run)

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 User-supplied Random Number Generation。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。