2016-12-03 166 views
0

我想弄清楚如何生成和存儲數組中的10個隨機數字,其中數字是兩位數字,每個數字位於0-7的範圍內。例如,10,23,35,77都可以,但不是1,78,89,99。而且,我想確保所有數字都是唯一的。這是我到目前爲止...如何在每個數字位於數字範圍內生成隨機數字?

import java.util.Random; 
public class RandomNum{ 
     public static void main(String[] args){ 
      Random rand=new Random(); 
      int[] randomFirstDigit=new int[10]; 
      int[] randomSecondDigit=new int[10]; 

      for(int i=0;i<10;i++){ 
       randomFirstDigit[i]=rand.nextInt(7-1+1)+1; 
      } 
      for(int i=0;i<10;i++){ 
       randomSecondDigit[i]=rand.nextInt(7-1+1)+0; 
      } 
      int[] randomArr=new int[10]; 
      for(int i=0;i<10;i++){ 
      randomArr[i]=(randomFirstDigit[i]*10)+randomSecondDigit[i]; 
      } 
      for(int i=0;i<=randomArr.length;i++){ 
       System.out.println(randomArr[i]); 
      } 
     } 
} 

上述代碼的主要問題是,有時,數組值不是唯一的。換句話說,兩個相同的數字像23,23一樣存儲在數組中。

任何人都可以幫我找出問題。

在此先感謝您的幫助。

+1

的問題是,這不是C++。標籤已移除。 –

+0

我假設這些downvotes來自閱讀標題的人,並沒有閱讀問題的細節。這個問題比「產生一個隨機數字」更多。我會建議編輯標題。 – byxor

回答

0

請你再次循環數組並檢查它是否已經存在或不存在。這不是最好的解決方案,因爲一些代碼是多餘的,但給你一些關於你如何處理它的提示。

import java.util.Random; 
public class RandomNum{ 
     public static void main(String[] args){ 
      Random rand=new Random(); 
      int[] randomFirstDigit=new int[10]; 
      int[] randomSecondDigit=new int[10]; 

      for(int i=0;i<10;i++){ 
       int gen = rand.nextInt(7-1+1)+1; 
       Boolean flag = false; 
       for(int j=0; j < 10; j++) 
        if(randomFirstDigit[j] == gen) 
        flag = true 
       if(!flag) randomFirstDigit[i] = gen; 
      } 

      for(int i=0;i<10;i++){ 
       int gen = rand.nextInt(7-1+1)+0; 
       Boolean flag = false; 
       for(int j=0; j < 10; j++) 
        if(randomSecondDigit[j] == gen) 
        flag = true; 
       if(!flag) randomSecondDigit[i] = gen; 
      } 

      int[] randomArr=new int[10]; 
      for(int i=0;i<10;i++){ 
       randomArr[i]=(randomFirstDigit[i]*10)+randomSecondDigit[i]; 
      } 
      for(int i=0;i<=randomArr.length;i++){ 
       System.out.println(randomArr[i]); 
      } 
     } 
} 
+1

此代碼不能編譯。它在第13行有一個缺失的分號,並且在我第一次運行它時拋出了一個ArrayIndexOutOfBoundException。它也產生很多0,這是不允許的。 – byxor

1

更簡單,計算成本更低的解決方案是每次生成一個數字,然後將其附加到字符串。之後您可以將其轉換爲整數。

要生成正好10個唯一編號,我們可以將我們生成的每個編號添加到HashSet,其中每個元素必須是唯一的。我們可以繼續這個,直到HashSet有10個元素。

import java.util.Random; 
import java.util.Set; 
import java.util.HashSet; 

public class TwoDigitGenerator { 

    public static void main(String[] args) { 

     // Generate 10 unique random numbers with desired properties. 
     Set<Integer> usedNumbers = new HashSet<>(); 
     while (usedNumbers.size() < 10) 
      usedNumbers.add(randomNumber()); 

     // Convert the set of numbers to an Integer array. 
     Integer[] numbers = usedNumbers.toArray(new Integer[usedNumbers.size()]); 

     for (Integer number : numbers) 
      System.out.println(number); 
    } 

    public static int randomNumber() { 
     Random random = new Random(); 
     String number = ""; 
     number += 1 + random.nextInt(7); // Generate first digit between 1 and 7 inclusively 
     number += random.nextInt(8); // Generate second digit between 0 and 7 inclusively 
     return Integer.parseInt(number); 
    } 

} 
+0

是否保證不存在重複? – Dave

+0

@Jon是的。我已經解決這個問題。 – byxor

2

所以可能的號碼列表是[10, 11, 12, ..., 17, 20, ..., 76, 77],它的尺寸爲7 * 8。我們需要的是10個不同的隨機數字,它們表示該列表上的索引,然後我們可以使用i -> (i/8 + 1) * 10 + (i % 8)將它們映射到實際數字。

下面是使用ThreadLocalRandom.ints一個相當簡單的解決方案:

int[] array = ThreadLocalRandom.current() 
     .ints(0, 7 * 8) 
     .distinct() 
     .limit(10) 
     .map(i -> (i/8 + 1) * 10 + (i % 8)) 
     .toArray(); 
+0

一個非常好的現代解決方案。使用ThreadLocalRandom而不是像我一樣使用java.util.Random。 – byxor

+1

我必須學會使用Streams。這些功能解決方案看起來非常棒。 –

+0

@JamesKPolk同意。他們看起來對我來說完全是魔術。 – byxor

相關問題