简体   繁体   English

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

[英]Creating array of length n with random numbers in JavaScript

Following up on this answer for creating an array of specified length, I executed the below to get a corresponding result but filled with random numbers, instead of zeros. 按照这个答案创建一个指定长度的数组,我执行下面的操作得到一个相应的结果,但是用随机数填充,而不是零。

var randoms = Array(4).fill(Math.floor(Math.random() * 9));

Well, mathematically speaking it's random , all right. 好吧,从数学上讲它是随机的 ,好的。 But I'd like the randomness to be visible within the array and not only between runs, of course. 但是我希望随机性在数组中可见,当然不仅仅是在运行之间。 Stupid computer... Don't do what I say. 愚蠢的电脑......不要做我说的话。 Do what I want! 做我想要的!

I can iterate and put it my random (and varying) values. 我可以迭代并将其作为随机(和变化)值。 But I wonder, of pure curiosity, if it's possible to get the right result with a one-liner, like above, MatLab-style. 但我想知道,纯粹的好奇心,如果有可能通过单线,如上所述,MatLab风格得到正确的结果。 Do I need to call eval(function()...) ? 我需要调用eval(function()...)吗? I've heard a lot of bad things about eval ... 我听说过很多关于评估的坏事......

Note that the above produces code like this: 请注意,上面生成的代码如下:

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

etc. while I want something like 等我想要的东西

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

What does Array#fill do? Array#fill做什么?

According to MDN 据MDN称

The fill() method fills all the elements of an array from a start index to an end index with a static value. fill()方法使用静态值将数组的所有元素从起始索引填充到结束索引。

You can use Function#apply , Array#map , Math.floor() , Math.random() . 您可以使用Function#applyArray#mapMath.floor()Math.random()

In ES6, Array#from and Arrow function can be used. 在ES6中,可以使用Array#fromArrow函数

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

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 
 <pre id="result"></pre> 

In ES5: 在ES5中:

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

 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); 
 <pre id="result"></pre> 

What is Array.apply(null, Array(n)) ? 什么是Array.apply(null, Array(n)) Can new Array(n) used here? 可以使用new Array(n)吗?

Both the above code create new array of six elements, each element having value as undefined . 上面的代码都创建了六个元素的新数组,每个元素的值都是undefined However, when used new syntax, the created array is not iterable. 但是,使用new语法时,创建的数组不可迭代。 To make the array iterable, Array.apply(null, Array(6)) syntax is used. 要使数组可迭代,使用Array.apply(null, Array(6))语法。


If you have lodash included on page, it's really easy. 如果页面上有lodash ,那真的很容易。

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

Note: This answer is inspired from Colin Toh's blog 注意:这个答案的灵感来自Colin Toh的博客

var randoms = Array(4).fill(Math.floor(Math.random() * 9));

This line of code will create a list of 4 of the same number because fill takes a single value and repeats it for the length of the list. 这行代码将创建一个由4个相同数字组成的列表,因为fill接受一个值,并按列表的长度重复它。 What you want to do is run the random number generator each time: 你想要做的是每次运行随机数生成器:

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]

https://jsfiddle.net/t4jtjcde/ https://jsfiddle.net/t4jtjcde/

Short and simple ES6 approach - 简短的ES6方法 -

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

Enjoy! 请享用!

I wonder if it's possible to get the right result with a one-liner... 我想知道是否有可能通过单线程获得正确的结果......

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

`const t = Array.from({length: n}, mapArrowFx); `const t = Array.from({length:n},mapArrowFx);

1) const t10 = Array.from({length: 10}, (v, k) => k); [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1) const t10 = Array.from({length: 10}, (v, k) => k); [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] const t10 = Array.from({length: 10}, (v, k) => k); [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2) const tEven = Array.from({length: 10}, (v, k) => 2*k); [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 2) const tEven = Array.from({length: 10}, (v, k) => 2*k); [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] const tEven = Array.from({length: 10}, (v, k) => 2*k); [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

........ ........

3) 3)

let n=100; const tRandom= Array.from({length: n}, (v, k) => Math.floor(Math.random()*n));

... ...

Solution from Sized array of random unique numbers 来自大小随机唯一数字的解决方案

 const uniqRandomNumbers = _.sampleSize(_.range(9), 4); console.log(uniqRandomNumbers); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM