2

乱数を生成する関数'generateRan'があります。この機能は変更できません。

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

次のようなコードを作成する必要があります。

  1. 1〜20の数字をランダムに印刷します。
  2. 数字1〜200をランダムに印刷します。

各番号は1回だけ印刷する必要があります。

この機能は何度でも使用できます。しかし、少し重いので、コードをより最適化したいと思います。

これが私がコーディングしたものです:

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のコードは正しくありません。

4

3 に答える 3

6

各番号は1回だけ印刷する必要があります

次に、範囲全体のを作成してから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状況に応じてこの方法の方が読みやすいようです。

于 2012-06-04T08:01:55.940 に答える
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));
}

印刷するすべてのintをリストに追加し、ランダムを使用して、これらのどれを印刷するかを選択します。あなたの関数はn回呼び出されます。

于 2012-06-04T08:16:16.510 に答える
0

重複の検索が高速であるため、リストではなくセットを使用することをお勧めします

Set<Integer> set = new HashSet<Integer>();
for(int i = 0; i < 20;) {
    Integer r = generateRan();
    if(set.add(r)) {
        System.out.println(r);
        ++i;
    }
}
于 2012-06-04T08:07:36.920 に答える