2017-08-30 107 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