2017-08-30 23 views
0

Node.jsの擬似乱数乱数生成器(prng)を評価したいと思っています。Math.randomと他のサードパーティ製のprngを評価したいと思います。擬似乱数乱数生成器で乱数列を生成する正しい方法

私が使用するテストスイートはENTです。

function generateNumber() { 
    return Math.floor(Math.random() * 10) 
} 

const numbers = [] 
for (let i = 0; i < 10000000;i++) { 
    const r = generateNumber() 
    numbers.push(r) 
} 

let result = '' 
numbers.map(function (t) { result += t }) 
const fs = require('fs') 
fs.writeFile('output.txt', result) 

上から生成されたファイルは、ENTとうまく動作しませんでした:

私が直面している問題は、Node.jsの中PRNGてENT用の入力ファイルを生成する方法ということです。しかし、私はLinuxコマンドで別のファイルを作成しました:

dd if=/dev/random of=random_output count=8192 

この出力はうまくいきました。 nodejsで作成したファイルがテキストファイルとして0と1であることがわかりました。多分、シーケンスはバイナリファイルに変換されるべきです。私はJavaScriptコードを変更する方法を知りたいですか?

+0

Windowsプラットフォームでnode.jsを使用してファイルを作成しましたか? – Psi

+0

@Psi yes windows 10 – itenyh

+0

ファイルを書き込む前にファイルをバイナリモードに切り替える必要があるかもしれません。それ以外の場合は、すべての0x0aを0x0aに変換します。0x0a => 'fs.writeFile( 'output.txt'、result、 'wb')' – Psi

答えて

0

はい、entは、プレーンバイナリデータが必要です。

let words = new Uint16Array(4096); 

for (let i = 0; i < 4096; i += 1) { 
    words[i] = Math.floor(65536 * Math.random()); 
} 

let fs = require('fs'); 
fs.writeFile('words.bin', new Buffer(words.buffer), 'binary'); 
+0

あなたは 'Uint16'を選んだ理由を説明できますか? – Bergi

+0

Math.random()に呼び出しごとに16個のランダムなビットが得られる、合理的な妥協点。 32はおそらく同様に動作しますが、RNGがどのように実装されているかわかりません。 –

+0

これはOPが評価しようとしていたものだと思います。そのため、この選択肢にどんな影響があるかを言及する必要があります。もっともっと急進的で、「Float64」を使ってどのように結果に影響を与えるかを知ることができます。 – Bergi