某个范围之间的随机数发生器有时会输出两次相同的数字

时间:2015-06-23 13:25:10

标签: java android

我使用以下代码生成随机int:

public static int randInt(int min, int max) {

    // NOTE: Usually this should be a field rather than a method
    // variable so that it is not re-seeded every call.
    Random rand = new Random();

    // nextInt is normally exclusive of the top value,
    // so add 1 to make it inclusive
    int randomNum = rand.nextInt((max - min) + 1) + min;

    return randomNum;
}

我正在使用它:

        int count = randInt(1, 4);

        System.out.println(count);

但它间歇性地显示相同的数字两次,有时连续3次。有没有办法检查最后生成的数字是否为新生成的数字,并将其更改为下一个随机随机等等?

感谢。

5 个答案:

答案 0 :(得分:2)

  

但它间歇性地显示相同的数字两次,有时甚至连续显示3次。

不确定。你的范围很窄。如果我正在正确地进行数学计算,那么你有两个相同数量的两个机会(四个中有一个机会)有25%的机会,并且有六个机会(一旦有十六个机会)你有三个机会连续相同的数字。这与翻转硬币并让它出现并没有明显的不同之处" head"连续两次或三次。

  

有没有办法检查最后生成的数字是否为新生成的数字并将其更改为下一个随机的等等?

按住最后一个值并检查。这是一些粗略的Java:

class NonRepeatRandom {
  Random r=new Random();
  int lastValue=-1;

  int randInt(int min, int max) {
    int result;

    do {
       result = rand.nextInt((max - min) + 1) + min;
    } while (result==lastValue);

    lastValue=result;

    return(result);
  }
}

答案 1 :(得分:1)

如果你不喜欢生成的随机数,你可以再次打电话给你,直到出现不同的数字:

// set "last" and "count" somehow ...

// keep generating random numbers until a new one comes up
while ((count = randInt(1,4)) == last);
last = count;

// ...

一般来说,没有理由相同的数字两次出现。这和掷骰子一样。

并抬头:不要尝试1:1的范围 - )

答案 2 :(得分:0)

要消除这种情况发生的最轻微的机会:

Random random = ...
int firstRandom = random.nextInt(20);
int secondRandom = random.nextInt(20);
while(firstRandom == secondRandom) secondRandom = random.nextInt(20);
//Now, there is no chance they will be the same :- )

另请注意,这些数字对我们来说似乎是随机的,但它们根本不是随机的。 看看这里: http://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml#.VYlfsfntlHw

编辑:如果你想提高效率并减少两次相同数字的机会,请改用if语句:

Random random = ...
int firstRandom = random.nextInt(20);
int secondRandom = random.nextInt(20);
if(firstRandom == secondRandom) secondRandom = random.nextInt(20);
//Although it may be again the same here, it is unlikely, especially when the limits are large like between 0 and 1000.

答案 3 :(得分:0)

问题是你正在实例化Random类的时间,并且这会杀死随机性,因为两个实例的种子几乎可以相同。请记住,计算机中的任何内容都不是随机的,Random类依赖于从每次请求新数字时确定性地突变的实际系统时间派生的种子。

只需坚持Random类的实例/类级变量,您的问题就会得到解决。

答案 4 :(得分:0)

通过选择1到4之间的随机数,无论最后一个是什么,您都有25%的机会获得个人数字。

如果您不想获得随机数字,您可以执行类似的操作

function getRandomNumber() {
    do {
        $n = rand(1,4);
    }while(in_array($n, array(2));
    return $n;
}