2012-07-16 7 views
4

이것은 숙제가 아닙니다. 내가 R에서/dev/random에서 임의의 정수 시퀀스 (0에서 9까지 50 자리)를 생성하고 싶습니다. hardware entropy key이 있습니다./dev/random에서 임의의 정수 생성

내가 숫자로 저를 공급받을 수도있는 두 개의 "아이디어", 난 후에 나는 발견 :

1) RDieHarder합니다./dev/random에 대한 액세스를 허용하는 것으로 보이지만 필요한 정수 시퀀스를 생성 할 수 없습니다. 예 :

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

2) accuracy package 진정한 난수를 제공하지만 오래된 것으로 보인다 내가 어떻게 dev에 /에서 불과 순서에/랜덤를 볼 수 있습니다. 예 :

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

예 크 누스 등을 읽고 TRNGs (따라서 하드웨어 엔트로피 키)의 문제를 이해합니다.

다른 아이디어? 감사.

+1

당신의 키는/dev에 무슨 일이 발생 않습니다/랜덤? 무작위 바이트 (0-255)? – Spacedman

+0

질문에 제공된 하이퍼 링크에 대한 모든 세부 정보를 찾을 수 있습니다. 나는/dev/random에게 엔트로피를 공급하여 차단을 멈추게한다고 생각한다. –

답변

4

여기 dev에 읽고 얻을 n 개의 번호를 A가 포함 b에에서하는 방법 당신의 열쇠는 시스템에 엔트로피를 공급하는 것으로 바쁠 것입니다. 나는 생각합니다 ....

'가장자리'효과 문제는 다음과 같습니다.

> (0:10) %% 7 
[1] 0 1 2 3 4 5 6 0 1 2 3 
: 매핑이 있기 때문에, 그런 다음 X %% 7 배의 0, 1, 2, 3 개 값을 생성 할 나는 0에서 10까지 임의의 정수를 생성,하지만 당신은 0 ~ 6의 정수를한다고 가정

이제 readBin은 거대한 8 비트 정수를 얻습니다. 그래서 시퀀스 끝의 홀수 몇 번째 여분 숫자가 큰 차이를 만들어서는 안됩니다 ...

+0

나는 그것을 이해하지 못한다. 그러나 그것은 매우 흥미 롭다. 감사. 주석을 달아 주셔서 감사합니다. –

+0

V. 흥미 롭다. –

+0

마지막 질문 하나. 1 : 5의 숫자를 말하고 싶다면 코드가 쉽게 적용됩니까? 그면을 어떻게 바꾸는 지 내게는 분명하지 않습니다. 많은 감사합니다. –

1

random.org에서 하드웨어 RNG의 데이터를 검색하는 random 패키지 (CRAN에도 있음)를 사용할 수 있습니다.

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/임의 그것은 블록에서 읽을 경우 만 :

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> 
+0

안녕하세요. 당신은 이메일을 얻을 것입니다. 나는 그것을 보았다. 그러나 나는/dev/random에 대한 접근을 원한다. 그래서 내가 찾던 것이 아니다. 감사. 훌륭한 패키지. –

2

글쎄, 늦은 대답이지만 구글을 통해 다른 누군가도 그렇게 할 수 있습니다.

코드는 실제로 매우 간단합니다. (단 아래의 라인이 실제로 필요합니다.)

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')