2015-02-09 131 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