Math.random()是否可以安全使用?

时间:2015-06-02 04:35:30

标签: java android performance recursion

我有一个生成随机整数的方法。我不希望重复整数,所以我创建了这段代码 -

int prevInt = 0;

private int randomInt() {
    int random = (int) (Math.random() * 3);
    //generate random numbers between 0 to 3 inclusive

    if(random == prevInt)
        return randomInt();
    //if previous random number is equal to currently generated
    //random number, then call this method again for a different
    //random number

    prevInt = random;
    return random;
    //else return the generated random number
}

以上代码是否可以安全使用?在最坏的情况下,Math.random() * 3生成的所有随机整数是否可能相同?

6 个答案:

答案 0 :(得分:1)

private final Random random = new Random();

private int randomInt(final int prev, final int max) {
  final int next = random.nextInt(max - 1);
  if(next >= prev){
    return next + 1;
  }else{
    return next;
  }
}

这将返回0到max之间的int而无需重复。

答案 1 :(得分:1)

public static double random()

返回带正号 double 值,大于或等于0.0且小于1.0。返回值是伪随机选择的,具有来自该范围的(近似)均匀分布。

生成随机(真正伪随机)数字的两种主要方法:

  
      
  1. Random类生成随机整数,双精度数,long数等,   在各种范围内。

  2.   
  3. 静态方法Math.random在0(包括)之间生成双精度数   和1(独家)。

  4.   

生成随机整数:

不要使用Math.random(它会产生双打,而不是整数) 使用Random类生成0到N之间的随机整数。 要生成一系列随机数作为一个单元,您需要使用单个Random对象 - 不要为每个新的随机数创建一个新的Random对象。

其他替代方案是:

SecureRandom, a cryptographically strong subclass of Random
ThreadLocalRandom, intended for multi-threaded cases

请查看this帖子。 SO Reference 1Reference 2

答案 2 :(得分:0)

从javadoc,Math.random()返回范围内的伪随机和(近似)均匀分布数。

因此,当您没有严格的准确性时,您可以使用它。否则,寻找更好的解决方案。

答案 3 :(得分:0)

尝试这个简单的代码并亲自看看

    for (int ran = 0; ran < 10; ran++) {
        int random = (int) (Math.random() * 3);
        System.out.println(random);
    }

我的案例输出

  

2 2 0 2 1 0 0 0 2 1

答案 4 :(得分:0)

是的,它是安全的,但我们永远不知道会发生什么,所以我们可以简单地将Math.random乘以两次以保持良好的安全性 的

int random = (int) (Math.random() * Math.random() * 3);

答案 5 :(得分:0)

首先,我必须指出你的问题标题不是那么清楚。安全可以意味着各种各样。在这种情况下,我认为你的意思是代码算法的安全性,而不是安全性,也不仅仅是Math.random()。

不幸的是,您的代码在算法上并不安全。即使Math.random是安全的,你的代码也总是有可能在任何时候运行:粗略地说它意味着你无法保证你的代码在有限的时间内结束。

假设您在4个数字中随机抽取数字。如果您在编号之前绘制随机数排除,那么您实际上并非从4个数字中抽取:它是3.我建议采用另一种方法:

int prevInt = -1;

private int randomInt() {
    if (prevInt == -1) {
        int random = (int) (Math.random() * 4);
        //generate random numbers between 0 to 3 inclusive
    } else if
        int random = (int) (Math.random() * 3);
        random = (random >= prevint) ? (random + 1) % 4 : random;
    }

    prevInt = random;
    return random;
}

private void resetRandom() {
    prevInt = -1;
    //use when you want to reset information that you have 'before' result.
}

此算法在有限时间内结束。关注Math.Random()本身是否危险或其他任何好人都会解释。