【问题标题】:Pick a number randomly from two numbers从两个数字中随机选择一个数字
【发布时间】:2014-03-17 04:55:02
【问题描述】:

我有两个整数,让他们成为

int a = 35:
int b = 70;

我想在运行时随机选择其中一个并分配给另一个变量。即

int c = a or b:

我想到的一种方法是用这两个整数创建一个数组,并在 0 和 1 之间找到一个随机整数,并将其用作数组的索引以获取数字..

或者随机化布尔值并在 if-else 中使用。

我的问题是,有没有更好、更有效的方法来实现这一目标? IE。从两个先前定义的整数中选择一个数字?

【问题讨论】:

  • 我认为您的 0/1 rand int 解决方案工作正常
  • 更多旁注:我想说,如果它总是只有 2 个整数,那么使用 random.nextBoolean() 是最简单的方法。不过,使用数组和索引变体会更容易扩展到 2 个以上的值。此外,如果您需要 2 个整数的不同权重,您可以滚动自己的 boolean nextBoolean(float probabilityForTrue ) { return random.nextFloat() < probabilityForTrue; }

标签: java random


【解决方案1】:

您要求更有效的解决方案是否有特定原因?除非此功能位于某个非常紧密的内部循环中(例如在光线追踪器中),否则您可能会尝试过早地优化您的代码。

如果您想避免使用数组,并且不喜欢 if 语句的“膨胀”,则可以使用三元选择运算符在两者之间进行选择:

int a = 35;
int b = 70;
int c = random.nextBoolean() ? a : b;

其中randomjava.util.Random 的一个实例。您可以将此实例作为final static 字段存储在您的类中以重复使用它。

如果您不需要真正的随机性,而只是想在给定代码块的每次调用中在两个数字之间切换,则只需存储 boolean 并切换它即可:

...
int c = toggle ? a : b;
toggle = !toggle;

由于我无法评论其他答案,我想指出其他一些答案的问题,这些答案建议生成更大范围内的随机整数并根据结果是奇数还是奇数做出决定甚至,或者如果它低于或高于中间值。这实际上与生成 0 到 1 之间的随机整数完全相同,只是过于复杂。 nextInt(n) 方法 uses the modulo operator 在 -2^31 和 (2^31)-1 之间随机生成的整数上,这基本上就是你最终要做的事情,只需使用 n = 2

如果您使用像Collections.shuffle() 这样的标准库方法,您将再次使事情变得过于复杂,因为标准库使用标准库的随机数生成器。

请注意,所有建议(到目前为止)都没有比我简单的 nextBoolean() 建议有效,因为它们需要不必要的方法调用和算术。

【讨论】:

  • 确实,其他建议的效率低于简单地获取随机布尔值。但是,OP 专门要求提供此类解决方案! :P 但是,是的,你在 the 答案中。
  • OP 要求更好更有效的解决方案,但提供的答案效率较低。我认为他们是否更好是一个见仁见智的问题。就个人而言,我更喜欢可读的代码而不是过于复杂的代码。
【解决方案2】:

另一种方法是,将数字存储到列表中,随机播放并获取第一个元素。

ArrayList<Integer> numbers=new ArrayList<Integer>();
numbers.add(35);
numbers.add(70);
Collections.shuffle(numbers);

numbers.get(0);

【讨论】:

  • 我们使用整个 ArrayList 不是造成很大的开销吗?一定很贵另外,两个成员的混洗集合应该与从两个数字中调用新随机数相同,对吧?
  • 是的。技术上它use random。但正如我所说,这只是另一种方式
  • 事实上,当我们想在四个特定数字中选择三个时,这种方式非常好。
【解决方案3】:

在我看来,这里的主要问题是两个数字的熵,而不是利用那个熵。索引数组或布尔值本质上是相同的。你还能做什么(希望它更随机)是让 Java 给你一个介于 0 到 100 之间的随机数。现在,如果选择的随机数是奇数,你选择int c = a。否则选择b。我可能是错的,但在 0 到 100 之间随机选择似乎比在两个数字之间随机选择更随机。

【讨论】:

  • 这似乎更好..这肯定会有更多的随机性。
【解决方案4】:

您可以简单地使用安全随机生成器(java.security.SecureRandom)。

try {
    r = SecureRandom.getInstance("SHA1PRNG");
    boolean b1 = r.nextBoolean(); 

    if (b1) {
        c = a;
    } else {
        c = b;
    }
} catch (NoSuchAlgorithmException nsae) {
    // Process the exception in some way or the other
}

更多信息请参考此链接information

【讨论】:

    【解决方案5】:

    随机化一个介于 1 和 10 之间的整数,如果大于 5,则取 b 的值,否则取 a。据我所知,没有其他方法可以从整数中进行选择。

    【讨论】:

    • 您的解决方案与@akshay2000 的解决方案类似,但我认为选择偶数奇数解决方案更随机
    • 是的.. 做这样的事情
    【解决方案6】:
    int a=1;
    int b=2;
    int get = new Random().nextBoolean()? a : b;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 2014-08-19
      • 2018-02-16
      • 2020-10-04
      相关资源
      最近更新 更多