다른 값으로 for 루프에서 Math.random ()을 수행하는 방법은 무엇입니까?

Dec 04 2020

배열 s을 9999 개의 다른 값 세트 로 채우려 고 합니다 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);