diff options
| author | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2015-07-31 00:04:46 +0200 |
|---|---|---|
| committer | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2015-07-31 00:04:46 +0200 |
| commit | 1ac63d456439978ed0badbf7e94fe085402466c6 (patch) | |
| tree | 9336e707a60008b2770e37f6fde41676636ed038 /SyncRNG.R | |
| parent | By passing numbers between R and C as doubles we can avoid the limitations of... (diff) | |
| download | SyncRNG-1ac63d456439978ed0badbf7e94fe085402466c6.tar.gz SyncRNG-1ac63d456439978ed0badbf7e94fe085402466c6.zip | |
added randbelow and shuffle methods
Diffstat (limited to 'SyncRNG.R')
| -rw-r--r-- | SyncRNG.R | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -5,10 +5,12 @@ dyn.load('RSyncRNG.so') SyncRNG <- setRefClass('SyncRNG', fields=list( seed='numeric', - state='numeric' + state='numeric', + BPF='numeric' ), methods=list( initialize=function(..., seed=0) { + BPF <<- 32 seed <<- seed tmp <- .Call('R_syncrng_seed', as.numeric(seed)) @@ -24,6 +26,32 @@ SyncRNG <- setRefClass('SyncRNG', rand=function() { r <- randi() return (r * 2.3283064365387e-10) + }, + randbelow=function(n) { + maxsize <- 2^BPF + if (n >= maxsize) { + warning(paste("Underlying random generator ", + "does not supply\n enough bits ", + "to choose from a population ", + "range this large.\n")) + return(round(rand() * n)) + } + rem <- maxsize %% n + limit <- (maxsize - rem) / maxsize + r <- rand() + while (r >= limit) + r <- rand() + return(round(r*maxsize) %% n) + }, + shuffle=function(x) { + y <- x + for (i in rev(1:(length(y)-1))) { + j <- randbelow(i+1) + tmp <- y[i+1] + y[i+1] <- y[j+1] + y[j+1] <- tmp + } + return(y) } ) ) |
