在Java中查找连续数字

4

我正在尝试使用蒙特卡罗算法计算下周乐透号码包含连续数字的概率。我决定对号码进行排序,以便更容易地找到连续的数字,但在网上搜索了很长时间后,没有找到适合我需求的资料。

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() );
       }
    }
}

目前我所拥有的是使用计数器来查找百万结果中连续数字的数量,但我真的不知道如何实际找到连续数字。


Arrays.sort(ticket)方法用于对数组进行排序。具体可以参考Java官方文档:http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html。 - Ya Wang
任何连续的数字,比如单个连续的一对数字都算吗?此外,如果有疑问,请返回{4, 8, 15, 16, 23, 42}; - mbomb007
1
似乎你的彩票随机器可能会返回相同的值超过一次...(我相信在彩票上这是不可能的) - gtgaxiola
2个回答

4

我最初读错了问题,对此表示歉意!现在让我们来分解一下。首先,我们如何检查两个数字是否连续?如果它们彼此相邻。这是正确的,但我们如何通过编程表达这一点呢?

实际上很简单,如果两个数字之间的差等于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没有元素!所以为了避免这个问题,我们需要从一开始搜索,而不是从零开始。
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;
}

我希望这可以帮助您理解问题,并使您获得比直接回答更多的好处!如有任何问题,请随时提出 :)


非常感谢您的示例/解释,我完全理解了! - John_K
抱歉有这么多文字。很高兴能帮忙! :) - Rob
有一件事.. 当我尝试编译时,它说找不到“ticket”变量(主方法),我想知道那是否是正确的变量,我是否需要稍微调整一下代码或者那个变量是错误的? - John_K
抱歉,我犯了一个错误!正在更新中。(我还没有尝试编译任何内容,所以如果有更多错误,请告诉我) - Rob
非常感谢。帮助巨大!^^ - John_K

0

我猜你需要计算每张票中连续的数字。鉴于你的数组已经排序,每当你发现两个数字之间的差为1时,只需将计数器加1,就像这样:

long countConsecutives(int[] sortedNumbers) {
    int nConsecutives = 0;
    for (int i = 0; i < sortedNumbers.length - 1; i++) {
        if (sortedNumbers[i + 1] - sortedNumbers[i] == 1) {
            nConsecutives++;
        }
    }
    return nConsecutives;
}

请注意,如果您的彩票有六个数字,例如[1, 2, 3, 4, 5, 6],这将返回5,因为它计算对之间的差异,并且您有5个连续的对:(2-1),(3-2),(4-3),(5-4)和(6-5)。
另请注意,通过向数组添加随机数字生成您的彩票会容易出现重复数字。要了解如何创建具有n个不同随机数字的数组,请阅读此答案:选择不存在的随机整数

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接