0

在我的代码中,每次按下按钮(在本例中为 r)时,我都必须生成一个随机数。当我按下这个按钮时,我希望它生成一个介于 0 和 n 之间的数字(在本例中为 3),但我不希望它生成之前生成的数字。所以我不希望连续两次生成相同的数字。所以 2 然后 2 不好。然而,2 然后 0 然后 2 是可以的。

我在这里四处寻找与我类似的问题,但没有一个真正有帮助。除了数组中的数字或其他东西外,其他所有人都生成一次。我不断生成,我希望能够检测到以前的相同数字。

我正在使用 Random 类,我考虑过使用 math.random 类,但它介于 0 和 1 之间,所以它并不太有用。任何帮助将不胜感激,谢谢!:D

4

4 回答 4

6

记住你上次生成的内容;重复生成直到它们不同

假设你想要数字 0-9

do
{
    int n = Random.nextInt(10);

} while (n == prev) // prev is the number you generated previously
prev = n;
于 2013-04-28T18:03:06.530 回答
4

由于第一个有 n 个可能的值,而后续只有 n-1 个值,因此只需使用randInt不同的参数,具体取决于您是否产生第一个值。尝试randInt对所有迭代使用相同的参数将导致非平坦分布。

class NoAdjacentPRNG implements Iterator<Integer> {
  private final Random rnd;
  private final int range;  // 3 to generate numbers in [0, 2).
  private Integer last;

  NoAdjacentPRNG(Random rnd, int range) {
    this.rnd = rnd;
    this.range = range;
  }

  public boolean hasNext() { return true; }
  public Integer next() {
    int n;
    if (last == null) {
      // The first time through, there are range possible values.
      n = rnd.nextInt(range);
    } else {
      // There are only range-1 possible values given that the
      // last is excluded.
      n = rnd.nextInt(range - 1);
      // Work around last.
      if (n >= last) { ++n; }
    }
    last = n;
    return n;
  }

  public void remove() { throw new UnsupportedOperationException(); }
}
于 2013-04-28T17:58:07.813 回答
2

你可以做类似的事情

int[] values = new int[360];
values[0] = random.nextInt(n+1);
for(int i = 0; i < values.length; i++) {
    values[i] = random.nextInt(n);
    if (values[i-1] == values[i]) values[i] = n;
}
于 2013-04-28T17:56:46.520 回答
1

你甚至可以超级简单:

public class NonRepeatingRandom extends Random {
  private int last = -1;
  @Override
  public int nextInt(int i) {
    int next = super.nextInt(i);
    while ( next == last) {
      next = super.nextInt(i);
    }
    return last = next;
  }
}
于 2013-04-28T18:29:46.867 回答