Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中生成6个不同的随机数_Java_Arrays_Math_Random - Fatal编程技术网

如何在java中生成6个不同的随机数

如何在java中生成6个不同的随机数,java,arrays,math,random,Java,Arrays,Math,Random,我想使用Math.random生成6个不同的随机数,并将它们存储到一个数组中。 我如何确保它们是不同的?我知道我需要使用for循环来检查数组,但是如何 这是射程。我只需要1到49之间的数字。 (1+(int)(Math.random()*49))生成任意6个数字(不一定不同)。点吧 a1在Java 8中: final int[] ints = new Random().ints(1, 50).distinct().limit(6).toArray(); 在Java 7中: public sta

我想使用Math.random生成6个不同的随机数,并将它们存储到一个数组中。 我如何确保它们是不同的?我知道我需要使用for循环来检查数组,但是如何

这是射程。我只需要1到49之间的数字。 (1+(int)(Math.random()*49))

生成任意6个数字(不一定不同)。点吧

a1在Java 8中:

final int[] ints = new Random().ints(1, 50).distinct().limit(6).toArray();
在Java 7中:

public static void main(final String[] args) throws Exception {
    final Random random = new Random();
    final Set<Integer> intSet = new HashSet<>();
    while (intSet.size() < 6) {
        intSet.add(random.nextInt(49) + 1);
    }
    final int[] ints = new int[intSet.size()];
    final Iterator<Integer> iter = intSet.iterator();
    for (int i = 0; iter.hasNext(); ++i) {
        ints[i] = iter.next();
    }
    System.out.println(Arrays.toString(ints));
}
publicstaticvoidmain(最终字符串[]args)引发异常{
最终随机数=新随机数();
final Set intSet=new HashSet();
while(intSet.size()<6){
intSet.add(random.nextInt(49)+1);
}
final int[]ints=new int[intSet.size()];
最终迭代器iter=intSet.Iterator();
for(int i=0;iter.hasNext();++i){
ints[i]=iter.next();
}
System.out.println(Arrays.toString(ints));
}
只是有点乱。将
集合
解装箱为
int[]
非常繁琐,这一事实对这一点没有帮助


需要注意的是,如果所需值的数量明显小于范围,则该解决方案应该是精细的。因为
1..49
6
大得多,你很好。否则性能会迅速下降。

您可以使用
设置

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

Integer[] arr = s.toArray(new Integer[s.size()]);
Set s=newhashset();
而(s.size()!=6){
s、 加(1+(int)(Math.random()*49));
}
整数[]arr=s.toArray(新整数[s.size()]);
在您的例子中,这就足够了,因为与生成它们的范围大小相比,不同随机数的数量相对较小


否则我将采用@JBNizet方法。

创建一个包含数字1到49的列表

创建一个介于0和列表大小之间的随机数
x
,获取列表中索引
x
处的数字,然后将其从列表中删除

重复上一步5次。你完成了。请注意,
java.util.Random
有一个
nextInt(int max)
方法,您应该使用它来代替
Math.Random()

关于性能的注意事项:与“尝试获得6个不同的数字”不同的解决方案相比,此解决方案有一个优势:它在O(n)时间内运行。50个数字中有6个是唯一的并不重要,但是如果你想从50个数字中得到48个或49个唯一的随机数,你会看到不同,因为在得到一个不在集合中的随机数之前,你可能需要生成许多随机数

编辑:


为了减少删除列表中的元素所带来的成本,您只需将索引
x
处的元素替换为列表的最后一个元素(在第二次迭代时,使用大小为-2的元素,等等)。

只需不断生成数字并将其添加到数组中,只要它们是唯一的;伪代码:

num = genNextRand()

For (array length)
    If (num not in array)
        addToArray()

Repeat while length not equal 6

不必检查数组是否没有重复项,您可以在生成数字时使用更智能的方法,这样就可以在一开始就强制执行唯一性

  • 创建一个
    boolean[]
    ,长度与您的范围相同(49个条目)
  • 从整个范围生成一个随机数
  • 将该数字放入输出数组
  • 布尔值[]
    中“划掉”相应的索引
  • 现在生成另一个随机数,但将范围缩小一(现在为48)
  • 不要直接使用该数字作为输出,而是扫描
    布尔[]
    ,计算所有未交叉的条目。当达到等于步骤5中生成的随机数的计数时停止。与该条目对应的编号是您的输出编号
  • 转至步骤4
  • 最后创建一个变量;将其初始化为
    0

    接下来,在从0到5的循环x中,在
    last+1
    49-6+x
    之间创建一个随机数。将此号码存储在列表中,并将
    last
    设置为以这种方式生成的号码

    您将得到一个由6个随机数组成的有序列表,范围为1..49,没有重复。

    在您的情况下,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;
        }
    
    公共静态int[]选择任意(int n){
    int[]彩票=新的int[n];
    int[]chooseFrom=新int[49];
    
    对于(inti=1;i我刚刚想到了一个Java8-的小主意

    Set<Integer> set = new LinkedHashSet<>();
    while(set.size() != 6)
        set.add(rnd.nextInt(49) + 1);
    
    Set Set=newlinkedhashset();
    while(set.size()!=6)
    集合。添加(rnd.nextInt(49)+1);
    
    该代码生成从6到0的数字并保存在ArrayList中

    如果生成的编号重复,程序将再次生成编号

    如果生成的编号不同,则添加该编号

    代码:

    private ArrayList ArrayList=new ArrayList();
    private Random rand=new Random();
    public void insertNumber(){
    while(true){
    int i=generateNumber();
    如果(!isGenerateEnumberExists(i)){
    地址编号(i);
    打破
    }
    }
    }
    //生成数字
    私有整数生成器枚举器(){
    返回兰特。耐克斯汀(6);
    }
    //确认该号码是否存在
    私有布尔IsGenerateEnumberExists(int y){
    for(int num:arraylist){
    如果(num==y){
    返回true;
    }
    }
    返回false;
    }
    //将数字添加到arrayList
    专用void addNumber(int x){
    arraylist.add(x);
    }
    
    只需不断生成数字并将其添加到数组中,只要它们是唯一的;生成一个数字并对照数组中的其他数字进行检查。与手动操作完全相同。掷骰子获得一个数字,检查它是否是您尚未拥有的数字,记录它,重复,直到您拥有所需的数字为止。-Or实现自己的shuffle,这是一个更通用的解决方案。这与OP的要求无关,但仍然…我忍不住对这种具有糟糕性能特征的可爱的单行程序感到失望。我在Clojure中看到了我的这一部分。我同意@MarkoTopolnik。虽然这是一个很好的单行程序,但JBNizet的解决方案有很多
    Set<Integer> set = new LinkedHashSet<>();
    while(set.size() != 6)
        set.add(rnd.nextInt(49) + 1);
    
    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);
    }