【问题标题】:How to do Math.random() in for-loop with different values?如何在 for 循环中使用不同的值执行 Math.random()?
【发布时间】:2021-03-15 20:05:25
【问题描述】:

我尝试用 9999 组不同的值 m[i][random] 填充数组 s,代码如下:

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 ] ], ...]

我做错了什么?如何解决?

【问题讨论】:

  • 您必须在外循环的每次迭代中制作m 的新副本。
  • 调试此类问题的提示: 您可以记录外循环前几次迭代的 s 的值。在这种情况下,这将排除一个可能的问题(每次产生相同的随机值)并帮助识别实际问题(来自先前迭代的随机值被最新迭代的随机值替换)。这将使您更接近根本原因(s 包含对 same 数组 m 的重复引用,因此对 m 的新更新会将您之前添加的内容更改为 s)。跨度>

标签: javascript arrays for-loop random


【解决方案1】:

在循环内创建 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);

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多