2017-04-05 95 views
1

我需要生成4位数为1到10亿的9位数的唯一随机数。用零填充直到9位数字。生成很多随机数

我的脚本适用于等式(但速度很慢)。 400000个数字。但不是4百万

我需要在一个文本文件中的数字。它的罚款只是CTRL + S的输出。

有没有什么方法可以优化内存/性能?

function zeroPad(num, places) { 
    var zero = places - num.toString().length + 1; 
    return Array(+(zero > 0 && zero)).join("0") + num; 
} 
var arr = [] 
while (arr.length < 4000000) { 
    var randomnumber = Math.ceil(Math.random() * 100000000) 
    if (arr.indexOf(randomnumber) > -1) continue; 
    arr[arr.length] = randomnumber; 
} 
for (i = 0; i < arr.length; i++) { 
    document.write(zeroPad(arr[i], 9) + '<br />'); 
} 
+5

出于好奇,为什么会有人需要4个亿的数字? – Slime

+0

我认为这是不正确的缩进 – TankorSmash

+0

每次你使用'document.write'浏览器都会执行DOM解析和其他昂贵的操作。将所有内容组合并将其添加到DOM一次会更好。尽管有400万个数字,但你的字符串会变得太大。尝试将其分配到1000个数字。 虽然我不认为浏览器可以处理4M。 – sniels

回答

1

可以在Node.js使用generatorsfile write streams

const fs = require('fs'); 
const writeStream = fs.createWriteStream('numbers.txt', {flags: 'w'}); 

writeStream 
.on('error', error => console.log(error)) 
.on('close',() => console.log('done')); 

const uniques = []; 

function write10k() { 
    let i = 0; 
    while (i < 1e4) { 
    const randomnumber = Math.ceil(Math.random() * 1e8); 
    if (uniques.indexOf(randomnumber) > -1) continue; 
    uniques[uniques.length] = randomnumber; 
    const line = zeroPad(randomnumber, 9) + '\n'; 
    writeStream.write(line); 
    i++; 
    } 
} 

function* writeGenerator() { 
    for (let i = 1; i <= 4e6; i++) { 
    yield write10k(); 
    console.log('wrote ' + (1e3 * i)); 
    } 
    writeStream.end(); 
} 

function zeroPad(num, places) { 
    const zero = places - num.toString().length + 1; 
    return Array(+(zero > 0 && zero)).join('0') + num; 
} 

const iter = writeGenerator(); 
let next = iter.next(); 

while (!next.done) { 
    next = iter.next(); 
} 

这将创建一个含有4万张独特的随机数的文件numbers.txt

+0

感谢您的回答。我得到一个Javascript堆内存不足的错误。也许我的机器对这个操作来说很小 –

0

这是一个打印在某些包装上的数字,印刷公司将在文本文件中包含数字。

我最后只是编辑我的代码,并以不同的时间间隔运行它10次。

我肯定会看看的node.js

感谢您的输入