Java 如何使用r.nextInt()生成除一个数字以外的随机数?
在我的代码中,我必须在每次按下按钮时生成一个随机数(在本例中为r)。当我按下这个按钮时,我希望它生成一个介于0和n之间的数字(在本例中为3),但我不希望它生成一个以前生成的数字。所以我不希望同一个数字连续生成两次。所以2那么2是不好的。2然后0然后2是正常的 我在这里四处寻找类似于我的问题,但没有一个真正有用。除数组中的数字外,其他所有人都只生成一次。我不断地生成,我希望能够检测到之前相同的数字Java 如何使用r.nextInt()生成除一个数字以外的随机数?,java,random,Java,Random,在我的代码中,我必须在每次按下按钮时生成一个随机数(在本例中为r)。当我按下这个按钮时,我希望它生成一个介于0和n之间的数字(在本例中为3),但我不希望它生成一个以前生成的数字。所以我不希望同一个数字连续生成两次。所以2那么2是不好的。2然后0然后2是正常的 我在这里四处寻找类似于我的问题,但没有一个真正有用。除数组中的数字外,其他所有人都只生成一次。我不断地生成,我希望能够检测到之前相同的数字 我使用的是Random类,我考虑过使用math.Random类,但是它介于0和1之间,所以这不是很有
我使用的是Random类,我考虑过使用math.Random类,但是它介于0和1之间,所以这不是很有用。任何帮助都将不胜感激,谢谢!:你可以做如下的事情
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;
}
int[]值=新的int[360];
值[0]=random.nextInt(n+1);
对于(int i=0;i
由于第一个值有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(); }
}
类NoAdjacentPRNG实现迭代器{
私有最终随机rnd;
private final int range;//3生成[0,2]中的数字。
私有整数最后;
无相邻PRNG(随机rnd,整数范围){
this.rnd=rnd;
这个范围=范围;
}
公共布尔hasNext(){return true;}
公共整数next(){
int n;
if(last==null){
//第一次通过时,存在可能的范围值。
n=rnd.nextInt(范围);
}否则{
//如果
//最后一项不包括在内。
n=rnd.nextInt(范围-1);
//工作到最后。
如果(n>=last){++n;}
}
last=n;
返回n;
}
public void remove(){抛出新的UnsupportedOperationException();}
}
记住上次生成的内容;重复生成,直到它们不同为止
说你想要数字0-9
do
{
int n = Random.nextInt(10);
} while (n == prev) // prev is the number you generated previously
prev = n;
你甚至可以非常简单:
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;
}
}
抱歉,这没有太大帮助-我没有指定,但我需要生成360个数字,并确保它不会生成相同的数字两次。但是感谢您的回答!@HaydenPerry哦,如果是这样的话,您必须使用循环。我希望您知道如何使用其中一个?;)@PeterLawrey,重写以使相邻成为唯一的限制。您没有“不要初始化变量!没关系。我不记得以前看过构造函数,也许我疯了。@Jyro117,也许我们两个都疯了。我在编辑中添加了一个ctor,但我想我在你要求之前就这样做了。你生成一个随机数,然后检查它是否与刚才生成的相同。如果是,则是。”创建一个新的随机数。重复,直到得到新的值。这是基本编程,并不复杂。您可以将math.random()的结果相乘(介于0和1之间的值)通过任意数字,您可以控制随机数的范围。抱歉,如果我混淆了任何人。当我生成一个数字时,我不希望它与之前生成的数字相同。其他每个数字都可以。此外,我尝试检查它是否是同一个数字,直到我得到新的数字,但我在co内执行此操作时遇到问题我有。谢谢你们的帮助伙计们顺便说一句:)根据问题是如何写的,这是解决方案。不需要把它复杂化!