@
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)。