-3

これは私の宿題です:

Random r = new Random();
public int get100RandomNumber() {
    return 1 + r.nextInt(100);
}

getrand100() (上記) という名前の定義済み関数が与えられます。この関数は、1 から 100 までの乱数である整数を返します。この関数は何度でも呼び出すことができますが、この関数はリソースを大量に消費することに注意してください。他の乱数発生器は使用できません。の定義を変更することはできませんgetrand100()

出力: 1 ~ 20 の数字をランダムな順序で出力します。(20個の乱数ではありません)

私が試したこと..

public class MyClass {

    static Random r = new Random();
    static HashSet<Integer>;

    public static void main(String args[]) {
        myMethod();
        System.out.println(s);
    }    

    public static void myMethod() {
        boolean b = false;
        s = new HashSet<Integer>();
        int i = getRand100();
        if (i >= 20)
            i = i % 20;
        int j = 0;

        int k, l;
        while (s.size() <= 20) 
        {
            System.out.println("occurence no" + ++j);
            System.out.println("occurence value" + i);
            b = s.add(i);
            while (!b) {
                k = ++i;
                if(k<=20)
                    b = s.add(k);
                if(b==true)
                    break;
                if (!b) {
                    l = --i;
                    if(i>=1&&i<=20)
                        b = s.add(l);
                    if(b==true)
                        break;
                }
            }
        }
        System.out.println(s);
    }

    public static int getRand100()
    {
        return r.nextInt(100) + 1;
    }
}

助けてくれてありがとう!

4

3 に答える 3

3

乱数ジェネレーターを使用して 1 から 20 の数字をランダムな順序で出力する方法を尋ねていると思います。これは「ランダム順列」とも呼ばれます。Fischer-Yates shuffleはそのようなアルゴリズムです。

ただし、アルゴリズムを実装するには、最初に乱数ジェネレーターが必要です。これは、N の範囲が 2 からシャッフルするセットのサイズまでの等しい確率で N 個のアイテムから 1 つを選択できる一方で、選択できるのは 1 つだけです。 100個に1個、等確率で。これは、モジュロ演算と「リローリング」を組み合わせることで簡単に取得できます。

于 2012-06-03T16:59:50.473 に答える
1

クラスの使用が許可されている場合はArrayList、リストに必要な数字 (この場合は 1 から 20) を入力し、リストからランダムに数字を選んで削除することをお勧めします。使用getRand100() % theList.size()は目的のために十分にランダムである必要があり、呼び出す必要があるのは 19 回だけです。要素が 1 つしか残っていない場合、リストから「ランダムに」選択する必要はもうありません。;-)

于 2012-06-03T19:38:43.093 に答える
0

1 から n までの任意の数値を変換する方法を思いついたと思います! (アイテムの数がわかっていると仮定して) n アイテムの一意の順列に。

本質的に、これにより、シャッフル アルゴリズムを使用することなく、デッキ全体の「即時」ランダム化が可能になります。今のところ、O(n^2) で実行され、BigInteger パッケージ (つまり Java または Javascript) を使用する必要がありますが、ランタイムを最適化する方法を探しています (ただし、正直なところ、最近では 2500 回の反復は何もありません)。とにかく、少なくとも 226 ビットの有効なランダム データが与えられた場合、関数は 10 ミリ秒未満で 52 個の整数のシャッフルされた配列を生成できます。

この方法は、10 進数を 2 進数に変換するために使用されるものと似ています (継続的に 2 で割るなど)。リクエストに応じてコードを提供させていただきます。今まで出会ったことがなかったので面白いです。

于 2015-04-02T07:29:32.730 に答える