2017-08-30 176 views
0

我想要評估Node.js中的僞隨機樸素隨機數生成器(prng):Math.random以及其他第三方prng。通過僞隨機樸素隨機數生成器生成隨機數序列的正確方法

我使用的測試套件是ENT

我所面臨的問題是如何產生的耳鼻喉科通過PRNG在Node.js的輸入文件:

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) 

從上面生成的文件並沒有很好地工作耳鼻喉科。不過,我創建了Linux命令的另一個文件:

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

這個輸出效果很好。我發現我用nodejs創建的文件是0s和1s作爲文本文件。也許序列應該被轉換成二進制文件。我想知道如何修改我的JavaScript代碼?

+0

您是否在windows平臺上使用node.js創建文件? – Psi

+0

@Psi yes windows 10 – itenyh

+0

所以,也許你需要在寫入文件之前將文件切換到二進制模式。否則,windows將所有的0x0a轉換爲0x0d 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