2014-02-10 2 views
0

меня это назначение:Печать случайных чисел без дубликатов

Печать 5 случайное число между 1-52, без дубликата, используя, если/другое.

Вот мой код. Он печатает некоторые цифры, но иногда печатает дубликаты.

import java.util.Random; 

public class RandomCards { 

    public static void main(String[] args) { 

     Random randomCards = new Random(); 
     int card; 

     for (int x = 1; x <= 5; x++) { 
      card = randomCards.nextInt(52) + 1; 
     } 
     if (card != randomCards) // if the value of card is not equal, proceed 
     { 
      System.out.print(card + " "); 
     } else { 
      return card; // if the value are the same get random integers again 
     } 
    } 
} 
+7

Мы прощаем вас, но это не вопрос. – Baby

+0

Что вы думаете? –

+2

Думаю, я понимаю, в чем проблема, и я редактирую вопрос. Отредактируйте или откат, если я ошибаюсь. – chrylis

ответ

0

Вы можете использовать этот

Random randomCards = new Random(); 
     int[] card={0,0,0,0,0}; 
     while(card[card.length-1] == 0) { 
      int temp=randomCards.nextInt(52); 
      for(int j=0;j< card.length ; j++){ 
      if(card[j] == 0){ 
       card[j] = temp; 
       break; 
      } 
      } 
     } 
     for(int j=0;j< card.length ; j++){ 
     System.out.println(card[j]); 
     } 
+0

'int [] card = new int [5]' такое же, как 'int [] card = {0,0,0,0,0}' – DnR

+0

да, но используется 'int [] card = {0, 0,0,0,0} 'мы также можем назначить его начальные значения – Sarz

0

Непонятно, что вы просите, но я из вашего кода отмечаю, что у вас нет дублирующего обнаружения. Вам нужно сохранить каждое генерируемое значение и проверить наличие дубликатов при создании нового. Я предлагаю создать Set<Integer>, чтобы удерживать ваши сгенерированные значения, вызывая add() для каждой новой карты и проверяя , чтобы узнать, было ли новое значение уже выбрано. Вы хотите изменить условие цикла на что-то вроде cards.size() < 5.

И, наконец, обратите внимание, что неправильное использование return card приведет к ошибке времени компиляции. return используется для завершения метода и отправки значения обратно туда, откуда он был вызван; метод main (который всегда равен void) не имеет возвращаемого значения, и окончание метода в любом случае не имеет смысла. Похоже, что какой-то код мог быть скопирован и вставлен из версии, где drawCard() был его собственным методом. Вместо этого просто продолжайте цикл, пока не найдете 5 уникальных карт (например, используя метод size(), о котором я упоминал ранее).

-1

Если проблема только о дубликатах, то вы можете хранить каждое случайное число, сгенерированное в массиве, и для каждого последующего вызова nextint(), проверьте, если он уже существует в массиве хранится значения и до это, звоните nextint() снова для этой итерации, иначе магазин он в массиве и перейдите к следующей итерации.

0

Может быть, это?

Random rand = new Random(); 

// ArrayList to store non-duplicate cards. 
ArrayList<Integer> cards = new ArrayList<Integer>(); 

// Iterate over to generate random numbers 
while (cards.size() < 5) 
{ 
    int r = rand.nextInt(52) + 1; 

    if (!cards.contains(r)) 
     cards.add(r);  // Only add if there is no such number in list 
} 

Надеюсь, это поможет.

+0

Это выглядит так, как мне нужно, но я продолжал получать ошибку. Я добавил: import java.util. *; import java.util.Random; в начале и еще два "}" внизу, то ошибки исчезли.Тем не менее, я не получаю никакого результата, хотя он говорит: jGRASP exec: java test ---- jGRASP: операция завершена. – user3291503

+0

Ничего! Я забыл сделать «System.out.print». Я понял. Спасибо за помощь. – user3291503

1
public static void main(String args[]) { 
    Random randomNumber = new Random(); 
    // Set stores only Unique values 
    Set<Integer> cards = new HashSet<Integer>(); 

    // Iterate over to generate random numbers 
    while (cards.size() < 5) { 
     int r = randomNumber.nextInt(52) + 1; 
     cards.add(r); 
    } 
    for(Integer card : cards) { 
     System.out.println(card); 
    } 
} 
0

Надеюсь, что это было бы полезно.

Он состоит из отдельных методов вычисления, установки нижней и верхней границ и печати списка, когда в нем есть 5 целых. Использование TreeSet решает проблему дубликатов. Вот оно,

package com.project.stackoverflow; 

import java.util.Random; 
import java.util.Scanner; 
import java.util.TreeSet; 

public class RandomGenerator { 

    public TreeSet<Integer> compute() { 
     TreeSet<Integer> generatedList = new TreeSet<Integer>(); 
     Scanner s = new Scanner(System.in); 
     System.out.println("Enter the lower bound for checking random numbers:"); 
     long lowBound = s.nextLong(); 
     System.out.println("Enter the upper bound for checking random numbers:"); 
     long topBound = s.nextLong(); 
     Random randomNumbers = new Random(); 
     for (int i = 0; i < topBound; i++) { 
      if (generatedList.size()==5) { 
       break; 
      } 
      else { 
      generatorFunc(lowBound, topBound,randomNumbers,generatedList); 
      } 
     } 
     return generatedList; 
    } 

    public void generatorFunc(long lowBound,long topBound,Random randomNumbers, TreeSet <Integer> generatedList) { 
     long limit = topBound - lowBound; 
     long part = (long)(limit * randomNumbers.nextDouble()); 
     int randomNum = (int) (part + lowBound); 
     generatedList.add(randomNum); 
    } 

    public void printList() { 
     TreeSet<Integer> testListVals = compute(); 
     System.out.println("New" + testListVals); 
    } 

    public static void main(String[] args) { 
     RandomGenerator obj = new RandomGenerator(); 
     obj.printList(); 
    } 
} 
+0

Возможно, вы также можете добавить условие, которое проверяет, является ли lowBound больше, чем upperBound, и генерирует исключение для того же самого или попросит пользователя повторно ввести значения. (если вы хотите, чтобы он управлялся пользователем, в противном случае вы можете продолжить работу с жестко закодированным материалом). – Bhaskar

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