在Java中查找连续数字

时间:2015-02-09 20:52:09

标签: java

我试图使用蒙特卡罗算法找到下周包含连续数字的乐透号码的概率。 我决定对这些数字进行排序可能会更容易实际找到连续数据,但经过大量网上搜索之后似乎没有什么能帮助我找到我正在寻找的内容

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

这是我到目前为止所知道的,我知道我会用一个计数器来查找超过百万条结果的连续数,但我实际上只是对如何实际找到连续数字感到难过

2 个答案:

答案 0 :(得分:3)

编辑答案,因为我先读错了这个问题,道歉!

好的,让我们解决这个问题。首先,我们如何检查两个数字是否连续?如果他们相互追赶。这是正确的,但我们如何通过编程来表达这一点?

实际上非常简单,如果它们之间的差异等于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()方法有什么用途?让我们来看看。

首先让我们编写方法的签名/组合,它必须放在main方法之外,正如我所说它需要接受一个整数数组,但它还需要返回连续数字的数量,如方法名称建议,如果程序询问“连续多少个数字?”你应该做出相应的回应该方法将从这样开始:

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

我希望这可以帮助您理解问题并使您受益,而不仅仅是一个直接的答案!有任何问题请随便问一下:)

答案 1 :(得分: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个不同的随机数创建数组,请阅读以下答案:Select a random int that doesn't exist