Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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 无需更换的随机数发生器?_Java_Random - Fatal编程技术网

Java 无需更换的随机数发生器?

Java 无需更换的随机数发生器?,java,random,Java,Random,我试着编写一个随机数生成器,它不会多次生成相同的随机数。但是我不能也不知道为什么。目前我的代码是这样的: public void printNS(){ System.out.print("Numeros Numeros: "); for(int i=0; i < 5 ; i++){ System.out.print( (int)(Math.random()*50) + ","); } System.out.print("; Numero

我试着编写一个随机数生成器,它不会多次生成相同的随机数。但是我不能也不知道为什么。目前我的代码是这样的:

public void printNS(){

    System.out.print("Numeros Numeros: ");

    for(int i=0; i < 5 ; i++){
        System.out.print( (int)(Math.random()*50) + ",");
    }

    System.out.print("; Numeros Stars: ");

    for(int i=0; i < 2 ; i++){
        System.out.print( (int)(Math.random()*12)+ ",");    
    }

}
public void printNS(){
系统输出打印(“Numeros Numeros:”);
对于(int i=0;i<5;i++){
System.out.print((int)(Math.random()*50)+“,”);
}
系统输出打印(“;数字星:”);
对于(int i=0;i<2;i++){
System.out.print((int)(Math.random()*12)+“,”);
}
}

在java 8中,您可以执行以下操作

 int[] rand = new Random().ints(start, end).distinct().limit(number).toArray();
有关更多详细信息/选项,请参阅

在Java8之前,您可以使用集合。生成随机数,直到设置的大小小于所需的随机数

private printStars(int loops, int factor) {
  for(int i=0; i < loops ; i++){
    System.out.print( (int)(Math.random()*factor) + ",");
  }

希望有帮助。关键是:当你有重复的代码时,看看那些“相同”的元素;然后将它们转移到另一种方法中

所以你想要
k
0
n
的不同随机数(使用
k

两种可能的方法:

  • 选择
    k
    随机数,就像您已经做的那样,并将它们存储在数据结构中。每次你选择一个数字时,检查它是否已经包含在结构中:如果是,继续选择,直到你有一个“新”的随机数。这是一种足够简单的方法,但循环可能会阻止您的应用程序。我建议使用
    集合
    ,因为它根据定义存储不同的元素

    Set<Integer> set = new LinkedHashSet<>(); // unordered
    while (set.size() < k){
       set.add((int)(Math.random()*n));
    }
    System.out.println(set);
    

  • 我建议使用第二种方法,因为它更干净,但我不知道您的效率要求。

    您可以使用集合结构吗?生成真正的随机数比您想象的要困难得多…大多数都是伪随机的。一个简单的解决方案是存储生成的号码,以便以后检查是否有重复。但这是一个记忆的代价。请你更清楚地说明你想问的是什么!您也可以尝试收藏。洗牌(0-9的数组)。好的,伙计,非常感谢,再问一个问题,有没有更简单的方法像我一样随机生成数字?你是什么意思
    Math.random()
    看起来很简单
    Set<Integer> set = new LinkedHashSet<>(); // unordered
    while (set.size() < k){
       set.add((int)(Math.random()*n));
    }
    System.out.println(set);
    
    List<Integer> list = new ArrayList<>(n);
    for (int i = 0; i < n; i++){
       list.add(i);
    }
    Collections.shuffle(list);
    list.subList(0, k).clear();
    System.out.println(list);