【问题标题】:How to generate 6 different random numbers in java without using collection.shuffle [duplicate]如何在不使用collection.shuffle的情况下在java中生成6个不同的随机数[重复]
【发布时间】:2014-05-01 07:01:48
【问题描述】:

我想使用 Math.random 生成 6 个不同的随机数并将它们全部存储到一个数组中。我怎样才能确保它们是不同的?到目前为止我只有这个,这有一个错误。我只需要 1 到 49 之间的数字。( 1 + (int) (Math.random() * 49) )。

public static void main (String []args) {
    int []randomNumArray = new int [6];
    randomNumArray[0] = randomNumber();
    System.out.println(randomNumArray[0]);

    for (int i = 1; i < 6; i++) {                   
        for (int j = 0; j < i; j++) {              
            randomNumArray[i] = randomNumber();
            do {
                if (randomNumArray[i] == randomNumArray[j]) {
                    randomNumArray[i] = randomNumber();
                }
            } while(randomNumArray[i] == randomNumArray[j]);
        }
        System.out.println(randomNumArray[i]);
    }
}

//This method is for generating random numbers
public static int randomNumber (){
    return  ( 1 + (int) (Math.random() * 49) );
}

【问题讨论】:

  • 您提到您的代码有错误。它究竟是如何表现出来的?
  • 对数组进行洗牌是获得非重复元素的好方法。你为什么不想使用它?
  • 当我运行这段代码时,数组仍然有重复@merlin2011
  • 应该只是编辑这个问题而不是开始一个新问题:stackoverflow.com/questions/22584244/…

标签: java arrays math random


【解决方案1】:

生成随机数并不断将它们添加到 Set 中,直到其大小 = 6. 一个集合只能包含唯一的元素。因此,您可以确保独一无二。

编辑:

public static void main(String[] args)  {
        Set<Integer> intSet = new LinkedHashSet<Integer>();
        Random r = new Random();
        while (intSet.size() <= 6) {
            intSet.add(r.nextInt(49)); // or your method of generating random numbers
        }
        System.out.println(intSet);
    }

【讨论】:

  • 如果您想要的数字 (6) 远小于可能的选项 (49),则此方法特别有效。如果它们接近,它将表现不佳,因为绘制“新数字”变得更加困难。
  • @Thilo - 是的。我同意。有没有一种有效的方法来确保/强制执行唯一性?
  • 改组数组是另一种好方法。
  • 这取决于性能要求。对于许多应用程序来说,即使生成 1 到 49 之间的 48 个唯一数字也需要的时间可以忽略不计。顺便说一句,如果你想保持一个很好的随机生成的顺序,我建议LinkedHashSet
  • @WhoAmI 你能告诉我怎么做吗?我有点不明白...
【解决方案2】:

显然,set 方法和洗牌数组是更有效的方法,但鉴于上下文,这里是对 OP 代码的修改以实现唯一性,以解决其代码中的“错误”。

import java.util.*;

public class Main {
    public static void main (String []args) {

        int []randomNumArray = new int [6];

        randomNumArray[0] = randomNumber();

        System.out.println(randomNumArray[0]);


        for (int i = 1; i < 6; i++)
        {                   
            int candidate;
            boolean foundMatch;
            do
            {
                candidate = randomNumber();
                foundMatch = false;
                for (int j = 0; j < i; j++)
                    if (candidate == randomNumArray[j])
                        foundMatch = true;
            } while (foundMatch);
            randomNumArray[i] = candidate;

            System.out.println(randomNumArray[i]);
        }
    }
    //This method is for generating random numbers
    public static int randomNumber (){
        return  ( 1 + (int) (Math.random() * 49) );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 2012-11-06
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多