有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从两个数字中随机选取一个数字

我有两个整数

int a = 35:
int b = 70;

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

int c = a or b:

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

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

我的问题是,有没有更好、更有效的方法来实现这一点?也就是说,从两个之前定义的整数中选择一个数字


共 (6) 个答案

  1. # 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之间的随机整数完全相同,只是过于复杂。在-2^31和(2^31)-1之间随机生成的整数上使用nextInt(n)方法uses the modulo operator,这基本上就是你最终要做的事情,只要使用n = 2

    如果您使用的是标准库方法,比如Collections.shuffle(),那么同样会使事情过于复杂,因为标准库使用标准库的随机数生成器

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

  2. # 2 楼答案

    您只需使用安全随机生成器(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

  3. # 3 楼答案

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

  4. # 4 楼答案

    另一种方法是,将数字存储到列表中,洗牌,然后获取第一个元素

    ArrayList<Integer> numbers=new ArrayList<Integer>();
    numbers.add(35);
    numbers.add(70);
    Collections.shuffle(numbers);
    
    numbers.get(0);
    
  5. # 5 楼答案

    int a=1;
    int b=2;
    int get = new Random().nextBoolean()? a : b;
    
  6. # 6 楼答案

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