5

这不是家庭作业。我想从 R 中的 /dev/random 生成一个随机整数序列(0:9 之间的 50 个数字)。我有一个硬件熵密钥

我找到了两个“想法”,但我都无法向我提供我所追求的数字:

1)RDieHarder。似乎允许访问 /dev/random,但我无法让它生成我需要的整数序列。例如

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

2) accuracy 包可以提供真正的随机数,但似乎已经过时了,我看不到如何从 /dev/random 中排序。例如

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

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

还有其他想法吗?谢谢。

4

3 回答 3

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 位整数,这些整数很大,因此序列末尾的奇数个额外数字应该没有太大区别......

于 2012-07-16T14:16:40.180 回答
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')
于 2015-03-25T17:12:25.703 回答
1

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

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>
于 2012-07-16T13:28:41.697 回答