Как сделать Math.random () в цикле for с разными значениями?

Dec 04 2020

Я пытаюсь заполнить массив s9999 различными наборами значений m[i][random], вот код:

let m = [[22,0],[53,0],[64,0],[45,0],[34,0]];
let l = m.length;
let s = [];
for (let j = 0; j < 9999; j++)
{
  for(let i = 0; i < m.length; i++)
  {
    let x = Math.floor(Math.random()*l);
    m[i][1] = x; 
  }
  s.push(m);
} 

Но я получаю те же значения:

console.log(s)
[ [ [ 22, 0 ], [ 53, 2 ], [ 64, 0 ], [ 45, 4 ], [ 34, 1 ] ],
  [ [ 22, 0 ], [ 53, 2 ], [ 64, 0 ], [ 45, 4 ], [ 34, 1 ] ],
  [ [ 22, 0 ], [ 53, 2 ], [ 64, 0 ], [ 45, 4 ], [ 34, 1 ] ],
  [ [ 22, 0 ], [ 53, 2 ], [ 64, 0 ], [ 45, 4 ], [ 34, 1 ] ],
  [ [ 22, 0 ], [ 53, 2 ], [ 64, 0 ], [ 45, 4 ], [ 34, 1 ] ],
  [ [ 22, 0 ], [ 53, 2 ], [ 64, 0 ], [ 45, 4 ], [ 34, 1 ] ],
  [ [ 22, 0 ], [ 53, 2 ], [ 64, 0 ], [ 45, 4 ], [ 34, 1 ] ], ...]

Что я делаю неправильно? Как это исправить?

Ответы

6 CertainPerformance Dec 04 2020 at 01:51

Создайте mподмассив внутри цикла (чтобы у вас был отдельный подмассив для каждой итерации), а не за его пределами - снаружи вы создали только один массив в памяти, на который указывает каждый индекс.

let s = [];
for (let j = 0; j < 9999; j++)
{
  let m = [[22,0],[53,0],[64,0],[45,0],[34,0]];
  let l = m.length;
  for(let i = 0; i < m.length; i++)
  {
    let x = Math.floor(Math.random()*l);
    m[i][1] = x; 
  }
  s.push(m);
}

Или, что более функционально и сразу Array.from:

const s = Array.from(
  { length: 2 },
  () => [[22,0],[53,0],[64,0],[45,0],[34,0]]
          .map(([num]) => [num, Math.floor(Math.random() * 5)])
);
console.log(s);