嘿所以我希望生成一个智能的随机二维数组。我的意思是什么?智能随机数生成是指您生成的数字不是非重复的,但在生成后不会很快重复。
这种技术非常实用,并且经常用于例如生成随机音乐播放列表。但是,我正在寻找的是在2D中。因此,不仅数字不是在每行中随机聚类,而且在每一列和对角线上也是如此。这可以实际完成吗?
答案 0 :(得分:0)
你想要什么并不清楚,但一个简单的方法是
这可以进行很多改进(例如,具有支持增量计算的分数函数,使用最佳跑步者池而不是单个跑步者,增加冷却温度等......)但对于小型情况甚至简单的方法可能就够了。
当然,如果得分函数具有特定形式,那么动态编程解决方案可以快速找到最佳效果......但为此您需要更准确地了解您正在寻找的内容。
答案 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)));
}
}
现在这些数字不会像直接邻居那样重复。您可以将其扩展到邻居等等。