为这个兰特发电机建议一些更优化的解决方案

时间:2012-06-04 07:55:44

标签: java algorithm random

我有一个生成随机数的函数'generateRan'。此功能无法更改。

int generateRan() {
    Random num = new Random();
    return (1 + num.nextInt(100));
}

我必须编写代码:

  1. 随机打印数字1-20。
  2. 随机打印1-200。
  3. 每个号码只能打印一次。

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

    以下是我编码的内容:

    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));
        }
    
    }
    

    目前1-200的代码不正确。

3 个答案:

答案 0 :(得分:6)

  

每个数字只能打印一次

然后您需要创建整个范围的List<Integer>,然后拨打Collections.shuffle

private static void displayNumbers(int minInclusive, int maxInclusive) {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = minInclusive; i <= maxInclusive; i++) {
        list.add(i);
    }
    Collections.shuffle(list);
    for (int value : list) {
        System.out.println(value);
    }
}

就我个人而言,我通常使用minInclusive, maxExclusiveminInclusive, count的参数,但看起来这种方式对您的情况可能更具可读性。

答案 1 :(得分:1)

假设您必须使用您的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));
}

您将要打印的所有整数添加到列表中,然后仅使用随机选择要打印的这些内容。你的函数被调用了n次。

答案 2 :(得分:0)

我建议使用Set而不是List,因为它在搜索重复项时速度更快

Set<Integer> set = new HashSet<Integer>();
for(int i = 0; i < 20;) {
    Integer r = generateRan();
    if(set.add(r)) {
        System.out.println(r);
        ++i;
    }
}