【问题标题】:Counting lottery odds - question about the code计算彩票赔率 - 关于代码的问题
【发布时间】:2021-10-25 14:49:17
【问题描述】:

我正在分析以下有关彩票赔率的代码,我有 2 个问题:

  • 为什么我们需要先将 lotteryOdds 的值设置为 1(另外,这种类型的计算中是否经常出现这种情况?)

  • 我知道用于计算赔率的公式 (n*(n-1)...(n-k+1)/(1*2...*k),但如果有人向我解释它是如何工作的按照重复“for”循环,我将不胜感激。

    import java.util.Scanner;
    
      public class LotteryOdds {
    
    
          public static void main(String[] args) {
    
          Scanner in = new Scanner(System.in);
    
          System.out.println(" How many numbers do you need to draw? ");
          int k = in.nextInt();
    
          System.out.println(" what is the highest numbers you can do draw? ");
          int n = in.nextInt();
    
          int lotteryOdds = 1;
    
          for (int i = 1; i <= k; i++) {
              lotteryOdds = lotteryOdds * (n - i + 1) / i;
    
              System.out.println("Your odds are 1 in " + lotteryOdds + " . Good luck!");
          }
    
      }
    

    }

【问题讨论】:

  • 想想如果lotteryOdds 为 0 会发生什么:lotteryOdds = 0 * (whatever) 将导致... 0。:)
  • 是的,我明白,但是为什么我们需要定义它。
  • 公式不应该是n!/(k! * (n-k)!)吗?这意味着您需要计算 3 个阶乘:n!k!(n-k)! - 所以您只需要一种使用一个循环来计算阶乘的方法。
  • “为什么我们需要定义它” - 那是因为您的代码需要它,即在某些时候您必须定义变量(并且您的代码会立即需要它或者您将如何计算odds * whatever 如果 odds 没有定义?而且您需要在任何情况下初始化任何局部变量,否则您将无法使用它。

标签: java for-loop math java.util.scanner


【解决方案1】:

lotteryOdds 变量需要为 1,因为如果你做 0 * 某事你总是会得到 0,所以程序总是会返回 0。 至于循环,让我们更改值并通过循环: 第一次迭代:

彩票赔率 = 1 * (n - 1 + 1) / 1 = n / 1

第二次迭代:

彩票赔率 = n * ((n - 2 + 1) / 2) = (n / 1) * ((n - 1) / 2) = n * ((n - 1) / 2) = ((n * (n - 1)) / (1 * 2)

等等。 所以当你概括它时,你会得到: (n * (n - 1)...(n - k + 1) / (1 * 2 ... * k) 就像上面的公式一样。

【讨论】:

    猜你喜欢
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多