我参与了我的代码,每次按下按钮时都必须生成一个随机数(在这种情况下为r)。当我按下这个按钮时,我希望它生成一个介于0和n之间的数字(在这种情况下为3),但我不希望它生成一个先前生成的数字。所以我不希望连续两次生成相同的数字。所以2然后2是坏的。 2然后0然后2就可以了。
我在这里寻找类似于我的问题,但没有一个真的有帮助。除了数组中的数字之外,其他所有人都生成一次。我一直在生成,我希望能够检测到之前的相同数字。
我使用的是Random类,我考虑过使用math.random类,但是介于0和1之间,所以这并不是太有用。任何帮助将不胜感激,谢谢! :d
答案 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;
}
}