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

Очень приятное, современное решение. +1 для использования ThreadLocalRandom, а не java.util.Random, как у меня. – byxor

+1

Мне нужно научиться использовать Streams. Эти функциональные решения выглядят довольно устрашающе. –

+0

@JamesKPolk Согласен. Они кажутся мне полной магией. – byxor

Смежные вопросы