it-roy-ru.com

Создание массива длины n со случайными числами в JavaScript

Следуя этому ответу для создания массива указанной длины, я выполнил нижеприведенное, чтобы получить соответствующий результат, но заполненный случайными числами вместо нулей.

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

Ну, математически говоря это случайно, все в порядке. Но я бы хотел, чтобы случайность была видна внутри массива, а не только между прогонами, конечно. Глупый компьютер ... Не делай, что я говорю. Делай, что я хочу!

Я могу повторять и ставить мои случайные (и меняющиеся) значения. Но мне интересно, из чистого любопытства, можно ли получить правильный результат с помощью одной строки, как выше, в стиле MatLab. Нужно ли вызывать eval (function () ...)? Я слышал много плохих вещей о eval...

Обратите внимание, что приведенный выше код выглядит следующим образом:

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

и т.д., пока я хочу что-то вроде

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

14
Konrad Viltersten

Что делает Array#fill делать?

По данным МДН

Метод fill() заполняет all элементы массива от начального индекса до конечного индекса статическим значением.

Вы можете использовать Function#apply , Array#map , Math.floor() , Math.random() .

В ES6 можно использовать Array#from и функцию стрелки .

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>

В 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>

Что такое 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

Примечание: Этот ответ основан на блоге Колина Тоха

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

Эта строка кода создаст список из 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]

https://jsfiddle.net/t4jtjcde/

6
Conrad.Dean

Короткий и простой подход ES6 -

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

Наслаждайтесь!

3
simonbor

Интересно, возможно ли получить правильный результат с одной строчкой ...

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

document.body.innerText = randoms;

1
7vujy0f0hy

`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]

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

........

3)

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

...

0
user3008938