【问题标题】:How can I generate a random number without use of Math.Random?如何在不使用 Math.Random 的情况下生成随机数?
【发布时间】:2012-11-06 17:08:44
【问题描述】:

我的项目需要我创建一个使用 JOptionPane 并且不使用 Math.Random 来创建随机值的基本数字猜谜游戏。你会怎么做呢?除了随机数生成器之外,我已经完成了所有工作。谢谢!

【问题讨论】:

标签: java random


【解决方案1】:

这里是简单随机生成器的代码:

public class SimpleRandom {
/**
 * Test code
 */
public static void main(String[] args) {
    SimpleRandom rand = new SimpleRandom(10);
    for (int i = 0; i < 25; i++) {
        System.out.println(rand.nextInt());
    }

}

private int max;
private int last;

// constructor that takes the max int
public SimpleRandom(int max){
    this.max = max;
    last = (int) (System.currentTimeMillis() % max);
}

// Note that the result can not be bigger then 32749
public int nextInt(){
    last = (last * 32719 + 3) % 32749;
    return last % max;
}
}

上面的代码是一个“Linear congruential generator (LCG)”,你可以找到how it works here.的很好描述

免责声明:

以上代码仅用于研究,不作为 替换为库存 Random 或 SecureRandom。

【讨论】:

  • 里面有什么神奇的数字? 32719、3 和 32749 ?我只是想弄清楚逻辑是如何工作的——很明显是这样。 :-)
  • 只有 2 个“大”素数,我需要一直增加我的最后一个值,但要保持在一定范围内。另请注意,如果您要求大于 32749 的数字,此质数生成器将失败,但我认为 OP 不希望做得那么大。
【解决方案2】:

在 JavaScript 中使用 Middle-square 方法。

var _seed = 1234;
function middleSquare(seed){
    _seed = (seed)?seed:_seed;
    var sq = (_seed * _seed) + '';
    _seed = parseInt(sq.substring(0,4));
    return parseFloat('0.' + _seed);
}

【讨论】:

    【解决方案3】:

    您可以使用java.security.SecureRandom。它具有更好的熵。

    另外,here 是来自书 Data Structures and Algorithm Analysis in Java 的代码。它使用与 java.util.Random 相同的算法。

    【讨论】:

      【解决方案4】:

      如果您不喜欢 Math.Random,您可以创建自己的 Random 对象。

      进口:

      import java.util.Random;
      

      代码:

      Random rand = new Random();
      int value = rand.nextInt();
      

      如果您需要其他类型而不是 int,Random 将提供 boolean、double、float、long、byte 的方法。

      【讨论】:

      • 这通常没问题,但我的教授要求我们不要使用任何给定的 java 方法。他希望我们创建自己的随机数生成器,可以将范围限制为指定值。不过谢谢!
      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2013-02-08
      • 2018-10-16
      • 2019-06-23
      • 2015-10-16
      • 2019-07-27
      相关资源
      最近更新 更多