从/ dev / random生成随机整数

时间:2012-07-16 13:09:52

标签: r random

这不是作业。我想在R中从/ dev / random生成一个随机整数序列(0:9之间的50位)。我有一个hardware entropy key

我找到了两个“想法”,我无法向我提供我想要的数字:

1)RDieHarder。似乎允许访问/ dev / random,但我不能让它生成我需要的整数序列。 e.g。

>library(RDieHarder)  
>x  <-dieharder(rng="/dev/urandom", psample=50) #urandom used for example

2)accuracy package可以提供真正的随机数,但似乎已过时,我无法看到如何从/ dev / random进行排序。 e.g。

>library(accuracy)
>x=runifT(50)

是的我已阅读Knuth等并了解TRNG的问题(因此硬件熵密钥)。

还有其他想法吗?感谢。

3 个答案:

答案 0 :(得分:5)

以下是如何从开发中读取并从a到b包含n个数字:

readRandom <- function(n,a,b,dev="/dev/urandom"){
  size = b-a + 1
  rng = file(dev,"rb") # open connection
  nums = readBin(rng,what="integer",n=n) # read some 8-byte integers 
  close(rng) # close the connection
  return( a + nums %% size ) # reduce range and shift
}

如果我从/ dev / random读取它会阻塞,因为我的系统用完了熵,但是你的密钥应该是忙于将熵输入系统,我想....

'边缘'效果问题如下。假设我生成0到10之间的随机整数,但是你想要从0到6的整数。那么X %% 7会生成两倍于0,1,2,3的值,因为映射是这样的:

> (0:10) %% 7
 [1] 0 1 2 3 4 5 6 0 1 2 3

现在readBin正在获得8位整数,这是很大的,所以序列末尾的奇数少数额外数字应该没有多大区别......

答案 1 :(得分:3)

嗯,这是一个迟到的答案,但我通过谷歌发现了这一点,所以其他人也可能。

执行此操作的代码实际上非常简单。 (实际上只需要下面两行。)

entropy <- file('/dev/urandom', 'rb')                           #rb = read binary .. try `cat /dev/urandom` at the command line to see what this "binary" output looks like if you don't encode it rationally
print(entropy)                                                  #you don't need to run this but reading it will help you understand what's going on
?readLines                                                      #again just to explain what's going on and what the other options, like scan(), do
readBin(entropy, what='integer')            #print random numbers from environmental noise
set.seed(readBin(entropy,1L))               #a truly random beginning to your R session…

在一行中:

file('/dev/urandom', 'rb') %>% readBin('integer')

答案 2 :(得分:1)

您可以使用random包(也在CRAN上),该包从random.org处的硬件RNG检索数据。

R> library(random)
R> randomNumbers(n=50,min=1,max=9,col=5)
      V1 V2 V3 V4 V5
 [1,]  8  7  4  6  3
 [2,]  4  8  3  6  8
 [3,]  5  2  9  1  6
 [4,]  9  5  6  5  5
 [5,]  2  2  1  3  7
 [6,]  6  3  9  7  5
 [7,]  7  9  1  9  9
 [8,]  5  9  1  3  8
 [9,]  8  2  9  3  7
[10,]  6  1  1  8  7
R>