除了一个数字之外,如何使用r.nextInt()生成随机数?

时间:2013-04-28 17:53:59

标签: java random

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

我在这里寻找类似于我的问题,但没有一个真的有帮助。除了数组中的数字之外,其他所有人都生成一次。我一直在生成,我希望能够检测到之前的相同数字。

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

4 个答案:

答案 0 :(得分:6)

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

假设您想要数字0-9

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

} while (n == prev) // prev is the number you generated previously
prev = n;

答案 1 :(得分: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(); }
}

答案 2 :(得分: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;
}

答案 3 :(得分: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;
  }
}