5

これは宿題ではありません。Rの/dev/ randomからランダムな整数シーケンス(0:9の間の50桁)を生成したいと思います。ハードウェアエントロピーキーがあります。

私は2つの「アイデア」を見つけましたが、どちらも私が求めている番号を提供することはできません。

1)RDieHarder。/ dev / randomへのアクセスを許可しているようですが、必要な整数シーケンスを生成するように取得できません。例えば

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

2)精度パッケージは真の乱数を提供できますが、古くなっているようで、/ 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は2倍の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

まあ、それは遅い答えです、しかし私はグーグルを通してこれを見つけたので他の誰かもそうするかもしれません。

これを行うためのコードは実際には非常に単純です。(実際に必要なのは、以下の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')
于 2015-03-25T17:12:25.703 に答える
1

random.orgのハードウェアRNGからデータを取得するランダムパッケージ(これも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 に答える