【问题标题】:When using a random parameter in a loop's qualifying comparison, does it call the randomization function once or each time the loops runs?在循环的限定比较中使用随机参数时,它是调用一次还是每次循环运行时调用随机化函数?
【发布时间】:2014-09-27 06:29:13
【问题描述】:

根据问题,假设您有以下代码:

    Random rand = new Random();
    for (int k = 0; k < rand.nextInt(10); k++) {
        //Do stuff here
    }

当循环开始运行时,k 是否只与rand.nextInt(10) 比较一次,以便循环在 0 和 9 之间的每个间隔运行的机会均等?还是在循环的每次迭代中都会对其进行比较,从而更有可能出现较小的数字?

此外,这在语言之间是否有所不同?我的示例是针对 Java 的,但大多数语言之间是否存在标准?

【问题讨论】:

    标签: java loops for-loop random compare


    【解决方案1】:

    当循环开始运行时,k 是否只与 rand.nextInt(10) 比较一次?

    不,k 与每次检查循环继续条件时rand 生成的下一个随机数进行比较。

    如果您希望生成一次随机数,请定义一个变量,并在循环之前将其设置为nextInt(10)。您还可以使用倒数的替代方法:

    for (int k = rand.nextInt(10); k >= 0 ; k--) {
        //Do stuff here
    }
    

    在至少四种使用 for 循环语法的其他语言中也是如此——C++、C、C# 和 Objective C。

    【讨论】:

    • 正是我想要的,谢谢!另外,倒数循环真的很聪明,我很感激这个提示。
    【解决方案2】:

    让我们testIt()

    public static int testIt() {
      System.out.println("testIt()");
      return 2;
    }
    public static void main(String[] args) {
      for (int i = 0; i < testIt(); i++) {
        System.out.println(i);
      }
    }
    

    输出是

    testIt()
    0
    testIt()
    1
    testIt()
    

    答案是在循环的每次迭代中都会对其进行比较,从而更有可能出现较小的数字。

    在其他语言中可能会有所不同。即使今天没有,明天也可能。如果你想知道,你应该测试它。

    编辑

    例如,在 Java 8 中,您可以编写

    import static java.util.stream.IntStream.rangeClosed;
    // ...
    
    public static void main(String[] args) {
      Random rand = new Random();
      rangeClosed(1,1+rand.nextInt(10)).forEach(n -> System.out.println(n));
    }
    

    【讨论】:

    • 这很好,测试它似乎是新/替代语言的好选择。
    • @Kyton 已编辑。我想到了一个 Java 8 的例子。
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多