我正在尝试使用蒙特卡罗算法找出下周乐透号码中包含连续号码的概率。
我决定对数字进行排序可能会让实际找到连续的更容易,但在网上搜索了很多之后,似乎没有什么能真正帮助我找到我正在寻找的东西

import java.util.Random;
import java.util.Arrays;
public class lotto {
    public static String getLottoTicket(){
            String lottoTicket = "";
            Random lottoNumbers = new Random();  //random object
            int [] ticket = new int[6];  //6 lotto numbers
            int counterr = 0;
            int a;
            for( int counter = 0; counter < ticket.length; ++counter ){
                ticket[counter] = (1 + lottoNumbers.nextInt(45) );  //numbers between 1-45
            }
            Arrays.sort( ticket );      //array class .. sorts array
            for(int counter = 0; counter < ticket.length; ++counter ){
                lottoTicket += ticket[counter];
                lottoTicket += " ";
            }

            return lottoTicket;
    }
    public static void main( String [] args ){
       int a, d, n=1, t, b;
        for(int i=1; i<1000000; i++){
            int counter = 0;
            System.out.println( getLottoTicket() );
       }
    }
}

这就是我到目前为止所拥有的,我知道我将使用计数器来查找超过一百万个结果的连续数,但我真的很困惑如何实际找到连续数

最佳答案

编辑答案,因为我首先读错了问题,抱歉!

好吧,让我们打破这个。那么首先,我们如何检查两个数字是否连续?如果他们一个接一个。这是正确的,但是我们如何通过编程来表达这一点?

其实很简单,如果两个数之差等于 1,则两个数是连续的。因此,要检查两个数是否连续,只需将它们相减,然后查看结果是否为 1(或 -1,具体取决于顺序)。

现在,这个问题的完整解决方案有点复杂。我们需要在您生成的连续乐透号码中找到 的所有 号码。因此,为了很好地分解它,我建议将这部分放入一个单独的方法中,称为 getConsecutiveNumbers(int [] lottoNumbers) 之类的东西。这样,您已经完成了基本设置,如下所示:

// Now returns int array instead of String
public static int [] getLottoTicket(){
        Random lottoNumbers = new Random();  //random object
        int [] ticket = new int[6];  //6 lotto numbers
        int counterr = 0;
        int a;
        for( int counter = 0; counter < ticket.length; ++counter ){
            ticket[counter] = (1 + lottoNumbers.nextInt(45) );  //numbers between 1-45
        }
        Arrays.sort( ticket );      //array class .. sorts array

        return ticket;
}

public static void main( String [] args ){
   int a, d, n=1, t, b;
    int totalConsecutives = 0;
    for(int i=1; i<1000000; i++){
        int counter = 0;
        int [] lottoTicket = getLottoTicket();

        // Keep a count of consecutives
        totalConsecutives += getConsecutiveNumbers( lottoTicket );
   }
    System.out.println("Number of consecutives: " + totalConsecutives );
}

现在是主要部分。这个神奇的 getConsecutiveNumbers() 方法有什么用?让我们来了解一下。

首先让我们编写必须放在主方法之外的方法的签名/组成,正如我所说它需要接受一个整数数组,但它也需要返回连续数字的数量,作为方法名称建议,如果程序询问“有多少个数字是连续的?”你应该做出相应的回应!该方法将这样开始:
public static int getConsecutiveNumbers(int [] lottoNumbers) {

    // How many

}

好的。由于到目前为止您的程序设置方式,我们可以假设这里提供给我们的乐透号码已经排序。这很好,这意味着我们只需要遍历数组并一一检查数字是否连续。你说我们怎么做?让我们也分解一下。

我们需要 遍历 数组来检查每个元素,所以这肯定需要某种循环。我看到你已经使用了 for 循环,所以让我们继续吧。
for(int i = 0; i < lottoNumbers.length; i++) {
    // Going through each number here
}

现在是智能部分。对于这个循环的每次迭代,我们需要检查元素 lottoNumbers[i] 是否与 lottoNumbers[i-1] 连续。你看?在英语中,这可能意味着第二个元素与第一个元素连续,然后第三个元素与第二个元素连续,依此类推,直到 i 到达数组的末尾。

但是 有一个问题。在这个循环开始时 i 为零(这是我们想要的),但是在这种情况下, lottoNumbers[i-1] 将给出一个 IndexOutOfBoundsException ,一个数组在索引 -1 处没有元素!所以为了避免这个问题,我们需要从 1 开始搜索,而不是从 0 开始。
public static int getConsecutiveNumbers(int [] lottoNumbers) {
    // i starts at 1 not 0
    for(int i = 1; i < lottoNumbers.length; i++) {
        // Going through each number here
    }

}

那么,我们如何结束这一切?让我们这样想。当我们遍历数组时,每次一个数字是连续的,只需将它添加到一个计数器,最后返回这个计数器。

这是最终的解决方案:
public static int getConsecutiveNumbers(int [] lottoNumbers) {
    int consecutives = 0;
    // i starts at 1 not 0
    for(int i = 1; i < lottoNumbers.length; i++) {
        // Going through each number here
        if(lottoNumbers[i] - lottoNumbers[i-1] == 1)
            consecutives++; // Numbers were consecutive

    }

    // Return the number of consecutives
    return consecutives;
}

我希望这可以帮助您理解问题,并且不仅仅是直接的答案!有任何问题请追问:)

关于java - 在 Java 中查找连续数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28419113/

10-11 12:38
查看更多