當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。