这不是作业。我想在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的问题(因此硬件熵密钥)。
还有其他想法吗?感谢。
答案 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>