打印没有重复的随机整数

时间:2014-02-10 05:14:36

标签: java jgrasp

我有这个任务:

  

在1-52之间打印5个随机整数,使用if / else。

不重复

到目前为止,这是我的代码。它会打印一些数字,但有时会打印重复数据。

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
        }
    }
}

6 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

目前尚不清楚你在问什么,但我从你的代码中注意到你没有任何重复的检测。您需要保存生成的每个值,并在创建新值时检查重复项。我建议您创建一个Set<Integer>来保存生成的值,为每张新卡调用add(),然后选中contains()以查看是否已选择新值。您还希望将循环条件更改为cards.size() < 5

最后,请注意您对return card的使用不正确,将导致编译时错误。 return用于结束方法并将值发送回调用它的位置; main方法(始终为void)没有返回值,无论如何结束方法都没有意义。看起来某些代码可能是从drawCard()是其自己的方法的版本中复制和粘贴的。相反,只需保持循环,直到找到5张独特的卡片(例如使用我前面提到的size()方法)。

答案 2 :(得分: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]);
        }

答案 3 :(得分: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
}

希望这有帮助。

答案 4 :(得分: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();
    }
}

答案 5 :(得分:-1)

如果你的问题只是重复问题,那么你可以存储在数组中生成的每个随机数,并且对于每次连续调用 nextint(),检查是否它已经存在于存储值数组中,直到它,再次为该迭代本身调用 nextint(),否则在数组中存储并转到下一次迭代。