【问题标题】:Smart random generated 2D array?智能随机生成二维数组?
【发布时间】:2018-04-08 10:21:06
【问题描述】:

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

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

【问题讨论】:

  • 所以你想生成一个二维数组对吗?
  • 只需生成一组不重复的数字,随机播放并重复。

标签: javascript arrays random 2d


【解决方案1】:

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

  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;
 }

现在在生成二维数组时,我们可以随机选择值,不包括所有直接邻居:

 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)));
  }
}

现在数字不会作为直接邻居重复。您可以将其扩展到 neighbours neighbours 等等。

【讨论】:

    【解决方案2】:

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

    1. 即使丑陋的二维数组也能生成随机有效
    2. 建立一个“分数”函数,给定数组返回更高的值以获得更好的值
    3. 应用小的随机突变,如果它增加分数,则保持解决方案有效
    4. 重复 3 直到满意或时间用完

    这可以进行很多改进(例如,具有支持增量计算的评分函数,使用最佳运行器池而不是单个运行器,添加冷却温度等......)但对于小情况,即使是简单的方法可能就够了。

    当然,如果分数函数具有特定形式,则动态规划解决方案可能会快速找到最佳最佳解决方案……但为此,您需要更准确地了解您正在寻找的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多