智能随机生成2D阵列?

时间:2018-04-08 10:21:07

标签: javascript arrays random 2d

嘿所以我希望生成一个智能的随机二维数组。我的意思是什么?智能随机数生成是指您生成的数字不是非重复的,但在生成后不会很快重复。

这种技术非常实用,并且经常用于例如生成随机音乐播放列表。但是,我正在寻找的是在2D中。因此,不仅数字不是在每行中随机聚类,而且在每一列和对角线上也是如此。这可以实际完成吗?

2 个答案:

答案 0 :(得分:0)

你想要什么并不清楚,但一个简单的方法是

  1. 生成随机有效,即使丑陋的2d数组
  2. 建立"得分"给定数组的函数返回更高的值以获得更好的值
  3. 应用小的随机突变,如果增加分数,则保持解决方案有效
  4. 重复3直到满意或时间耗尽
  5. 这可以进行很多改进(例如,具有支持增量计算的分数函数,使用最佳跑步者池而不是单个跑步者,增加冷却温度等......)但对于小型情况甚至简单的方法可能就够了。

    当然,如果得分函数具有特定形式,那么动态编程解决方案可以快速找到最佳效果......但为此您需要更准确地了解您正在寻找的内容。

答案 1 :(得分:0)

对于给定的位置,您可以确定其所有邻居:

  function neighbours(arr, x, y, value){
    const result = [];
    for(const [dx,dy] of [[1, -1], [1, 0], [1, 1], [0, -1], [0, 1], [-1, -1], [-1,0], [-1, 1]])
      if(arr[x + dx] && (y + dy) in arr[x + dx])
         result.push(arr[x + dx][y + dy]);
   return result;
 }

现在生成2D数组时,我们可以随机选择值,排除所有直接邻居:

 const random = arr => arr[Math.floor(Math.random() * arr.length)];

 const set = Array.from({length: 100}, (_, i) => i);

 const result = [];
 for(let x = 0; x < 10; x++) {
  result[x] = [];
  for(let y = 0; y < 10; y++) {
     const exclude = neighbours(result, x, y);
     result[x][y] = random(set.filter(el => !exclude.includes(el)));
  }
}

现在这些数字不会像直接邻居那样重复。您可以将其扩展到邻居等等。