2015-02-09 166 views
3

我在使用蒙特卡洛算法找出包含连续数字的下周乐透号码的概率。 我决定排序的数字可能会更容易地找到consecutives但搜索在网上没有的很多后似乎真的帮助我什么我正在寻找在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()); 
     } 
    } 
} 

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

+0

Arrays.sort(ticket); http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html – 2015-02-09 20:57:17

+0

任何连续的数字,如在一个连续的对中都会计数?另外,如果有疑问,'return {4,8,15,16,23,42};' – mbomb007 2015-02-09 20:57:25

+1

似乎您的乐透随机器可能会多次返回相同的值......(我相信这是不可能的彩票) – gtgaxiola 2015-02-09 20:59:44

回答

2

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

好的,我们来分解一下。所以首先,我们如何检查两个数字是否连续?如果他们一个接一个。这是正确的,但我们如何通过编程来表达这一点?

它实际上很简单,如果它们之间的差值等于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; 
} 

我希望这有助于你理解问题和福利,也不仅仅是一个直线上升的答案更多!有任何问题请去问:)

+0

非常感谢.. 由于您的例子/解释,我完全理解了这一点! – 2015-02-09 21:53:08

+0

对不起,文字山。乐意效劳! :) – Rob 2015-02-09 21:57:47

+0

有一件事..当我试图编译它说它找不到'票'变量(主要方法)只是想知道如果这是正确的变量,我不得不修改代码周围有点或如果它是错误的变量? – 2015-02-09 22:20:01

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