在JavaScript中使用随机数创建长度为n的数组

Kon*_*ten 16 javascript arrays random

按照这个答案创建一个指定长度的数组,我执行下面的操作得到一个相应的结果,但是用随机数填充,而不是零.

var randoms = Array(4).fill(Math.floor(Math.random() * 9));
Run Code Online (Sandbox Code Playgroud)

好吧,从数学上讲它是随机的,好的.但是我希望随机性在数组中可见,当然不仅仅是在运行之间.愚蠢的电脑......不要做我说的话.做我想要的!

我可以迭代并将其作为随机(和变化)值.但我想知道,纯粹的好奇心,如果有可能通过像MatLab这样的单线程获得正确的结果.我需要调用eval(function()...)吗?我听说过很多关于评估的坏事......

请注意,上面生成的代码如下:

[7,7,7,7]
[3,3,3,3]

等我想要的东西

[1,2,3,4]
[4,3,8,4]

Tus*_*har 24

怎么Array#fill办?

据MDN称

fill()方法使用静态值将数组的所有元素从起始索引填充到结束索引.

您可以使用Function#apply,Array#map,Math.floor(),Math.random().

在ES6,Array#from以及Arrow功能都可以使用.

Array.from({length: 6}, () => Math.floor(Math.random() * 9));
Run Code Online (Sandbox Code Playgroud)

Array.apply(null, Array(6)).map(() => Math.floor(Math.random() * 9));

var randomArr = Array.from({length: 6}, () => Math.floor(Math.random() * 9));

document.getElementById('result').innerHTML = JSON.stringify(randomArr, 0, 4); // For demo only
Run Code Online (Sandbox Code Playgroud)
<pre id="result"></pre>
Run Code Online (Sandbox Code Playgroud)

在ES5中:

Array.apply(null, Array(6)).map(function(item, index){
    return Math.floor(Math.random() * 9);
});
Run Code Online (Sandbox Code Playgroud)

var randomArr = Array.apply(null, Array(6)).map(function(item, index){
    return Math.floor(Math.random() * 9)
});

document.getElementById('result').innerHTML = JSON.stringify(randomArr, 0, 4);
Run Code Online (Sandbox Code Playgroud)
<pre id="result"></pre>
Run Code Online (Sandbox Code Playgroud)

什么是Array.apply(null, Array(n))?可以new Array(n)在这里用吗?

上面的代码都创建了六个元素的新数组,每个元素的值都是undefined.但是,使用new语法时,创建的数组不可迭代.为了使数组可迭代,使用Array.apply(null, Array(6))语法.


如果页面上有lodash,那真的很容易.

_.times(6, _.random.bind(0, 100))
        ^                        - Number of elements in array
                         ^       - Random number range min
                            ^^^  - Random number range max
Run Code Online (Sandbox Code Playgroud)

注意:这个答案的灵感来自Colin Toh的博客


7vu*_*0hy 12

我想知道是否有可能用单线获得正确的结果......

var randoms = [...Array(4)].map(() => Math.floor(Math.random() * 9));

document.body.innerText = randoms;
Run Code Online (Sandbox Code Playgroud)


Con*_*ean 6

var randoms = Array(4).fill(Math.floor(Math.random() * 9));
Run Code Online (Sandbox Code Playgroud)

这行代码将创建一个包含4个相同数字的列表,因为fill它会获取单个值并在列表长度内重复该值.你想要做的是每次运行随机数生成器:

var makeARandomNumber = function(){
    return Math.floor(Math.random() * 9);
}
var randoms = Array(5).fill(0).map(makeARandomNumber);
console.log(randoms)
// => [4, 4, 3, 2, 6]
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/t4jtjcde/


sim*_*bor 5

简短而简单的 ES6 方法 -

// randomly generated n = 4 length array 0 <= array[n] <= 9
var randoms = Array.from({length: 4}, () => Math.floor(Math.random() * 10));
Run Code Online (Sandbox Code Playgroud)

享受!