Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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_Algorithm_Random - Fatal编程技术网

Java 为这个兰德发电机提出一些更优化的解决方案

Java 为这个兰德发电机提出一些更优化的解决方案,java,algorithm,random,Java,Algorithm,Random,我有一个函数“generateRan”,可以生成随机数。此功能无法更改 int generateRan() { Random num = new Random(); return (1 + num.nextInt(100)); } 我必须编写以下代码: 随机打印数字1-20 随机打印数字1-200 每个数字只能打印一次 该功能可以使用任意次数。但是它有点重,所以我想让代码更加优化 以下是我编写的代码: import java.util.ArrayList; import jav

我有一个函数“generateRan”,可以生成随机数。此功能无法更改

int generateRan() {
    Random num = new Random();
    return (1 + num.nextInt(100));
}
我必须编写以下代码:

  • 随机打印数字1-20
  • 随机打印数字1-200 每个数字只能打印一次

    该功能可以使用任意次数。但是它有点重,所以我想让代码更加优化

    以下是我编写的代码:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    public class Test {
    
        public static void main(String[] args) {
            List<String> list = new ArrayList();
            Test t = new Test();
            iniList(list, 20);
    
            for (Integer i = ((t.generateRan()) % 20); list.size() > 0; i = 1+((t
                    .generateRan()) % 20)) {
                if (list.contains(i.toString())) {
                    list.remove(i.toString());
                    System.out.println(i);
                }
            }
    
            System.out.println("********");
    
            iniList(list, 200);
    
    
            for (Integer i = ((t.generateRan()%2)*100 + t.generateRan()) ; list.size() > 0; i = ((t.generateRan()%2)*100 + t.generateRan())) {
                if (list.contains(i.toString())) {
                    list.remove(i.toString());
                    System.out.println(i);
                }
            }
    
        }
    
        private static void iniList(List list, int i) {
            for (Integer k = 1; k <= i; k++) {
                list.add(k.toString());
            }
        }
    
        int generateRan() {
            Random num = new Random();
            return (1 + num.nextInt(100));
        }
    
    }
    
    import java.util.ArrayList;
    导入java.util.List;
    导入java.util.Random;
    公开课考试{
    公共静态void main(字符串[]args){
    列表=新的ArrayList();
    测试t=新测试();
    名单(名单,20);
    对于(整数i=((t.generateRan())%20);list.size()>0;i=1+((t
    .generateRan())%20){
    if(list.contains(i.toString())){
    list.remove(i.toString());
    系统输出打印LN(i);
    }
    }
    System.out.println(“**********”);
    iniList(列表,200);
    对于(整数i=((t.generateRan()%2)*100+t.generateRan());list.size()>0;i=((t.generateRan()%2)*100+t.generateRan()){
    if(list.contains(i.toString())){
    list.remove(i.toString());
    系统输出打印LN(i);
    }
    }
    }
    私有静态列表(列表列表,int i){
    对于(整数k=1;k
    每个数字只能打印一次

    然后,您只需创建整个范围的
    列表
    ,然后调用

    private static void displayNumber(int-minInclusive,int-maxInclusive){
    列表=新的ArrayList();
    
    对于(int i=minInclusive;i我将使用集合而不是列表来重新编译,因为它在搜索重复项时更快

    Set<Integer> set = new HashSet<Integer>();
    for(int i = 0; i < 20;) {
        Integer r = generateRan();
        if(set.add(r)) {
            System.out.println(r);
            ++i;
        }
    }
    
    Set Set=newhashset();
    对于(int i=0;i<20;){
    整数r=generateRan();
    如果(集合添加(r)){
    系统输出println(r);
    ++一,;
    }
    }
    
    假设您必须使用generateRan()函数,否则请使用Collections.shuffle,如图所示

    public static void main(String[] args) {
        List<Integer> list = new ArrayList();
        initList(list, 200);
    
        while (list.size() > 0) {
            int index = generateRan() % list.size();
            System.out.println(list.remove(index));
        }
    }
    
    public static void initList(List<Integer> s, int size) {
        for (int i = 1; i <= size; i ++)
            s.add(i);
    }
    
    public static int generateRan() {
        Random num = new Random();
        return (1 + num.nextInt(100));
    }
    
    publicstaticvoidmain(字符串[]args){
    列表=新的ArrayList();
    初始列表(列表,200);
    while(list.size()>0){
    int index=generateRan()%list.size();
    System.out.println(list.remove(index));
    }
    }
    公共静态void initList(列表s,整数大小){
    
    对于(inti=1;i首先,您不应该创建
    newrandom()
    每次调用函数时。这几乎保证会给您非随机结果。是的,我知道……但这是一种强迫,无法改变……您看到的任何其他缺陷?检查一个最著名的算法以生成随机结果Number@user1433826:也许您在心里将RNG建模为一个服务,构造函数创建了一个i与该服务的接口。相反,您应该在心里将其建模为一个状态机。构造函数类似于
    internalstate=somefunction1(currentTime);
    generateNumber
    的每次调用都是
    returnvalue=generator(internalstate);internalstate=somefunction2(internalstate);
    。安全的随机数生成器通常使用
    somefunction2(熵)
    ,在这种情况下,创建新的随机数实例可能效率低下,但不一定是错误的。巧妙但不错的方法+1;)这对1-200的情况不起作用,或者至少它不是完全随机的。例如,101-200不能是第一个选择的数字。
    public static void main(String[] args) {
        List<Integer> list = new ArrayList();
        initList(list, 200);
    
        while (list.size() > 0) {
            int index = generateRan() % list.size();
            System.out.println(list.remove(index));
        }
    }
    
    public static void initList(List<Integer> s, int size) {
        for (int i = 1; i <= size; i ++)
            s.add(i);
    }
    
    public static int generateRan() {
        Random num = new Random();
        return (1 + num.nextInt(100));
    }