我有一个网格的应用程序,其中二维数组表示可能被阻止或打开的网站,被阻止为0
并打开为1
。设布尔数组为boolean gridSite[N*N]
。我通过正确地将用户的索引更改为1-D数组中的所需索引,将二维数组用于二维。更改索引的函数如下int index(int i,int j){ return (i-1)*N + j-1 ;}
。用户为这两个维度提供了索引b / w 1
和N
。
在模拟过程中,我需要通过随机选择它们来打开网站。我的意思是最初所有网站都被封锁了。下一步是选择随机索引i
和j
并将其打开。再次(随机)重复此操作,直到满足条件。我有一个用于特定目的的库,可以通过此代码StdRandom.uniform(N)
生成随机数,但问题是,这并不能解决问题。当第一次运行时,它将生成一个随机站点并打开它,但现在我必须为剩余的位置生成一个随机索引。假设我们有20x20网格并且它第一次选择4,7
,那么下次它不应该再选择它。如何实现这个
答案 0 :(得分:1)
听起来你需要从1到N
的数字的随机排列,在这种情况下N = 20 * 20 = 400
。
N
之间的数字。答案 1 :(得分:0)
使用以下类,它将按顺序为您提供一个随机索引并精确枚举所有索引一次。
import java.util.Enumeration;
import java.util.Random;
public class RandomPermuteIterator implements Enumeration<Long> {
int c = 1013904223, a = 1664525;
long seed, N, m, next;
boolean hasNext = true;
public RandomPermuteIterator(long N) throws Exception {
if (N <= 0 || N > Math.pow(2, 62)) throw new Exception("Unsupported size: " + N);
this.N = N;
m = (long) Math.pow(2, Math.ceil(Math.log(N) / Math.log(2)));
next = seed = new Random().nextInt((int) Math.min(N, Integer.MAX_VALUE));
}
public static void main(String[] args) throws Exception {
RandomPermuteIterator r = new RandomPermuteIterator(100);
while (r.hasMoreElements()) System.out.print(r.nextElement() + " ");
//output: 50 52 3 6 45 40 26 49 92 11 80 2 4 19 86 61 65 44 27 62 ...
}
@Override
public boolean hasMoreElements() {
return hasNext;
}
@Override
public Long nextElement() {
next = (a * next + c) % m;
while (next >= N) next = (a * next + c) % m;
if (next == seed) hasNext = false;
return next;
}
}