数组取随机数( 2 或 3 个),取到的数据上下左右不相邻?

2017-05-30 08:54:59 +08:00
 slucus

rt

var a = [
  [0, 1],
  [2, 3],
  [4, 5],
  [6, 7]
];
2347 次点击
所在节点    问与答
23 条回复
geelaw
2017-05-30 11:44:33 +08:00
@slucus ……………………我说了这么一大段,您简略一下就完全失去含义了。

如果我总是返回 (0,0), (1,1) 这两个位置你看可以吗?肯定不可以对吧?

而且这个问题和数组本身没有什么关系,是对位置的随机。

(刚刚搞错了,没必要假设 m、n 的范围,只要是正整数即可)

回到题目,假设你要求的是我所说的那种随机,那么一个可行的方案是:先生成第一个位置,然后生成根据第一个位置生成第二个位置。

例如:用 0 为下标起点。

第一步,生成一个均匀随机位置 (a,b);
第二步算出 k = mn,设置 u=v=x=y= +∞;
第三步:
- 如果 (a,b) 不是首行,k 减少 1,u=(a-1)*m+b ;
- 如果 (a,b) 不是首列,k 减少 1,v=a*m+b-1 ;
- 如果 (a,b) 不是末行,k 减少 1,x=(a+1)*m+b ;
- 如果 (a,b) 不是末列,k 减少 1,y=a*m+b+1。
此时 k 代表剩下可以选的位置数目;
第四步:生成 0 到 k (左含右不含)的一个随机数 t ;
第五步:
- 如果 t >= u,t 增加 1 ;
- 如果 t >= v,t 增加 1 ;
- 如果 t >= x,t 增加 1 ;
- 如果 t >= y,t 增加 1 ;
第六步:设置 (c,d) = (floor(t / m), t mod m);

输出:(a,b,c,d)。

对于 3 或者更多个也有类似的方法。

另一种方法是逐步拒绝。

第一步:生成一个均匀随机的位置(a,b);
第二步:反复生成均匀随机的位置(c,d)直到(c,d)和(a,b)不是上下左右相邻;
输出:(a,b,c,d)。
imn1
2017-05-30 12:55:04 +08:00
如果确定格式是这样——每行只有两个数,这就好办了
同一列,二进制右边第一位是相同的
同一行,二进制右边第二位是相同的
抓住这两点就可以了

什么?值不一定是连续的?
我说的是位置,index 总是连续的吧?
zhuzhuyule
2017-05-30 22:52:15 +08:00
@blankme 竟然不 @我,差评哟。 确实哟,看了我是老了[哭笑] !

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/364681

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX