【问题标题】:How to generate random numbers in java [duplicate]如何在java中生成随机数[重复]
【发布时间】:2013-10-02 00:02:37
【问题描述】:

如何使用Math.random() 生成以二为单位上升的随机数?比如我想从集合(2,4,6,8)中生成一个随机数,你会怎么做呢?

【问题讨论】:

  • 那么,您的意思不是“生成”一个随机数吗?您只想从数字数组中选择一个随机索引?

标签: java random numbers


【解决方案1】:

对于这个特定的集合,你可以使用

(int)(Math.random() * 4) * 2 + 2

这里:

  • Math.random() 生成一个大于或等于 0.0 且严格小于 1.0 的数字;
  • (int)(... * 4) 给出 0、1、2、3 之一。
  • ... * 2 + 2 给出 2、4、6、8 之一。

【讨论】:

  • 你假设集合是总是那个特定的算术级数。
  • @hexafraction:没错。我在问题中没有看到任何迹象表明 OP 是在这个特定集合之外的任何东西之后。
  • @hexafraction “以二为单位上升的数字”
  • @arshajii:是的,谢谢。编程语言之间切换过多。
【解决方案2】:

好的,我们来做一个真正的通用解决方案。

int lower = 2;
int upper = 8;
int step = 2;
int rand = (int)(Math.random() * (upper-lower+1));
int result = rand - rand%step + lower;

如果您想在您指定的集合之外的另一个集合中生成数字,只需更改 lower、upper 和 step 变量以适合您的集合。如果它在集合中,它包括上限。

【讨论】:

  • 您需要在该表达式中围绕 (upper-lower+2) 使用括号。此外,您可以使用 (rand&-2) 来执行 (rand - rand%2) 而不进行除法运算。如果您想保留除法,您可以获得更通用的解决方案,其中任何算术级数都可以用(上),(下)以及指定共同差的(步)值来描述。
  • 谢谢,已相应修复。
  • 足够赞了。 :) 我还注意到您正确地将 (upper-lower+2) 更改为 (upper-lower+1) 以允许步长为 1。干得好!
【解决方案3】:

(几乎)完全通用的方法并不难。

static randInt(int first, int last, int step) {
    int nsteps = (last+1-first) / step;
    return first + step*(int)(nsteps*Math.random());
}

如果stop 不是序列的一部分,则返回从{start, start+step, start+2*step, ... }stop 的随机整数,或者stop 之前的最后一个数字。

int choice = randInt(2, 8, 2); /* random choice from {2, 4, 6, 8} */

...解决了示例问题。

(几乎)部分是它不处理参数中的整数溢出或符号错误(step 为零,step<0first<last 时,反之亦然。)

【讨论】:

    【解决方案4】:
    int[] numSet={2,4,6,8};
    Random myRand=new Random();
    int myNum=numSet[myRand.nextInt(numSet.length)];
    

    这会创建一个数字数组,即随机对象,然后从数字数组中选择一个随机元素。这并不假定这些数字属于任何类型的数学系列。就此而言,它们可能是 11、25、31、876、984368、7432、84562。

    请不要告诉我有一个多项式可以从它的 y 值生成该集合。我知道。

    【讨论】:

    • 如果集数达到一百万怎么办?您必须将所有数字不必要地存储在一个数组中。
    • @arshajii 鉴于当前原始问题的模糊性,所有答案都将部分正确且部分不可行,因为我们不知道 OP 的参数。 AFAICT 有一个 5 分钟的窗口编辑,但我不能确定。
    • 这里有一个小危险,有人会逐字复制此代码,并且为每个新选择创建一个新的 Random() 对象比来自同一个 Random 对象的连续值“随机”要少得多。尽管如此,如果编码人员小心地只创建一次该对象并在多次调用或迭代中重用它,它就更好了,因为它更有可能是线程安全的。
    【解决方案5】:

    将这些数字放入一个数组中。 使用数组的长度 - 1 生成一个随机数,并将其作为索引来随机选择一个数组元素。

    【讨论】:

      【解决方案6】:

      你也可以像这样使用 java.util.Random 类:

          int values[] = {2,4,6,8};
          Random randomGenerator = new Random();
          int randomInt = randomGenerator.nextInt(values.length);
          int randomValue = values[randomInt]; /* Here's your random value from your set */ 
      

      【讨论】:

        【解决方案7】:

        我想添加一个更笼统的答案。

        假设集合中最小的整数是A,集合的大小是S。集合中的随机整数会是这样的:

        A + myRandom.nextInt(S) * 2
        

        对于您在 Java 中的具体示例,它将是:

        Random myRandom = new Random();
        int randomNum = 2 + myRandom.nextInt(4) * 2;
        

        【讨论】:

          猜你喜欢
          • 2013-04-06
          • 2011-04-25
          • 2018-09-14
          • 1970-01-01
          • 2011-05-10
          • 2011-02-21
          相关资源
          最近更新 更多