2016-12-03 164 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

相关问题