How to generate 6 different random numbers in java

后端 未结 10 1300
猫巷女王i
猫巷女王i 2020-12-10 21:04

I want to generate 6 different random numbers by using Math.random and store them into an array. How can I make sure that they are different? I know I need to use for-loop t

相关标签:
10条回答
  • 2020-12-10 21:28

    I've just came up with a small idea for Java 8-.

    Set<Integer> set = new LinkedHashSet<>();
    while(set.size() != 6)
        set.add(rnd.nextInt(49) + 1);
    
    0 讨论(0)
  • 2020-12-10 21:33

    You can use a Set.

    Set<Integer> s = new HashSet<>();
    while(s.size() != 6){
       s.add(1 + (int) (Math.random() * 49));
    }
    
    Integer[] arr = s.toArray(new Integer[s.size()]);
    

    This is enough to do this in your case because the number of distinct random numbers is relatively small compared to the size of the range you generate them.

    Otherwise I would go with @JBNizet approach.

    0 讨论(0)
  • 2020-12-10 21:34

    That code generate numbers from 6 to 0 and save in ArrayList.

    If generated number was duplicated the program generate numbers again.

    If generated number is different that number is added.

    Code:

    private ArrayList<Integer> arraylist = new ArrayList<Integer>();
    
    private Random rand = new Random();
    
    public void insertNumber() {
        while (true) {
            int i = generateNumber();
            if(!isGenerateNumberExists(i)){
                addNumber(i);
                break;
            }
        }
    }
    //Generate numbers
    private int generateNumber() {
        return rand.nextInt(6);
    }
    //Confirm if that number exists
    private boolean isGenerateNumberExists(int y) {
        for (int num : arraylist) {
            if (num == y) {
                return true;
            }
        }
        return false;
    }
    //Add number to arrayList
    private void addNumber(int x) {
        arraylist.add(x);
    }
    
    0 讨论(0)
  • 2020-12-10 21:36

    Just keep generating numbers and adding them to the array as long as they are unique; psuedocode:

    num = genNextRand()
    
    For (array length)
        If (num not in array)
            addToArray()
    
    Repeat while length not equal 6
    
    0 讨论(0)
  • 2020-12-10 21:37

    in your case n=6

         public static int[] chooseAny(int n){
            int[] lottery = new int[n];
            int[] chooseFrom = new int[49];
            for(int i=1 ; i <= 49 ; i++)
                chooseFrom[i-1] = i;
            Random rand = new Random();
            int N = 49;
            int index;
            for(int i=0 ; i < n ; i++){
                //pick random index
                index = rand.nextInt(N);
                lottery[i] = chooseFrom[index];
                chooseFrom[index] = chooseFrom[N-1];
                N--;
            }
            return lottery;
        }
    
    0 讨论(0)
  • 2020-12-10 21:38

    Create a list containing the numbers 1 to 49.

    Create a random number x between 0 and the size of the list, take the number being at index x in the list, and remove it from the list.

    Repeat the previous step 5 times. And you're done. Note that java.util.Random has a nextInt(int max) method that you should use instead of Math.random().

    Note regarding performance: this solution has an advantage compared to the "try until you get 6 different numbers" various solutions: it runs in a O(n) time. It doesn't matter much for 6 unique numbers out of 50, but if you want to get 48 or 49 unique random numbers out of 50, you'll start seeing a difference, because you might have to generate many random numbers before getting one that isn't already in the set.

    EDIT:

    to reduce the cost induced by the removal of the elements in the list, you could instead simply replace the element at index x with the last element of the list (and at the second iteration, with the element at size - 2, etc.)

    0 讨论(0)
提交回复
热议问题