【问题标题】:The correct way to produce random number sequence through pseudorandom naive random number generator通过伪随机朴素随机数发生器产生随机数序列的正确方法
【发布时间】:2017-08-30 15:15:42
【问题描述】:

我想评估 Node.js 中的伪随机朴素随机数生成器(prng):Math.random 以及其他第三方 prng。

我使用的测试套件是ENT

我面临的问题是如何在Node.js中通过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。但是,我在 Linux 命令中创建了另一个文件:

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

这个输出效果很好。我发现我用nodejs创建的文件是0s和1s作为文本文件。也许应该将序列转换为二进制文件。我想知道如何修改我的 javascript 代码?

【问题讨论】:

  • 你是在windows平台上用node.js创建的文件吗?
  • @Psi 是 windows 10
  • 所以也许你需要在写入文件之前将文件切换到二进制模式。否则,windows 将所有 0x0a 转换为 0x0d 0x0a => fs.writeFile('output.txt', result, 'wb')
  • 如果这是关于创建特定类型文件的 node.js 问题,请准确描述文件中的内容。目前尚不清楚该文件应包含什么。您使用当前 node.js 创建的是一个巨大的串联字符串,由一大堆浮点数压缩在一起,它们之间没有分隔符,这可能对任何人都没有用。您希望实际文件是什么样的?

标签: javascript node.js random


【解决方案1】:

是的,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');

【讨论】:

  • 你能解释一下你为什么选择Uint16吗?
  • 一个合理的折衷方案,每次调用 Math.random() 获得 16 个随机位。 32 可能也可以,但我不确定 RNG 是如何在后台实现的。
  • 嗯,我认为这正是 OP 想要评估的,所以你应该提到这个选择有什么影响(并可能展示如何实现替代方案)。一个可能更激进,并使用Float64 来查看它如何影响结果。
猜你喜欢
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多