Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用r.nextInt()生成除一个数字以外的随机数?_Java_Random - Fatal编程技术网

Java 如何使用r.nextInt()生成除一个数字以外的随机数?

Java 如何使用r.nextInt()生成除一个数字以外的随机数?,java,random,Java,Random,在我的代码中,我必须在每次按下按钮时生成一个随机数(在本例中为r)。当我按下这个按钮时,我希望它生成一个介于0和n之间的数字(在本例中为3),但我不希望它生成一个以前生成的数字。所以我不希望同一个数字连续生成两次。所以2那么2是不好的。2然后0然后2是正常的 我在这里四处寻找类似于我的问题,但没有一个真正有用。除数组中的数字外,其他所有人都只生成一次。我不断地生成,我希望能够检测到之前相同的数字 我使用的是Random类,我考虑过使用math.Random类,但是它介于0和1之间,所以这不是很有

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

我在这里四处寻找类似于我的问题,但没有一个真正有用。除数组中的数字外,其他所有人都只生成一次。我不断地生成,我希望能够检测到之前相同的数字


我使用的是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内执行此操作时遇到问题我有。谢谢你们的帮助伙计们顺便说一句:)根据问题是如何写的,这是解决方案。不需要把它复杂化!