-1

このコードは明らかに乱数ジェネレーターですが、可能な限り簡単な方法で一意にするにはどうすればよいですか?

import java.util.Random;


public class Scramble {

public static void main(String[] args) {

            for (int i=0; i < 10; i++)
            {

            Random randomGenerator = new Random();
            int n = randomGenerator.nextInt(10);

            System.out.println("Random number is " +n);
            }

      }

}
4

5 に答える 5

6

この少数の可能な値の場合:

  1. すべての可能な値のリストを生成します
  2. シャッフルする
  3. 各ステップで次のアイテムを返す
于 2012-04-27T05:27:51.683 に答える
2

最大長のLFSR ( PRBSシーケンスなど) は適合しますか?

たとえば、PRBS31 シーケンス (x 31 +x 28 +1) は、すべての 31 ビット整数 (0 を除く) を 1 サイクル (2 31 -1 ビット長)に 1 回だけ生成することが保証されています。

実装もかなり簡単です。

public int prbs31(int state) {
    int feedback = ((state >> 30) ^ (state >> 27)) & 1;
    return ((state << 1) | feedback) & 0xffffffff;
}

何らかの (ゼロ以外の) 整数から始めて、prbs31連続して呼び出します - 前の結果を渡します (これはフィードバック レジスタです!)

PRBS31 は、非常に優れた統計的にランダムなビット パターンを生成します (真のランダムビット パターンと混同しないでください)。

ただし、隣接する値は非常に似ていることに注意してください。上記の方法では、PRBS シーケンスに対して 1 ビットのスライディング ウィンドウを実行します。つまり、隣接するすべての値に 30 ビットの共通点があります (場所は異なりますが)。

しかし、次のように、レジスタを毎回 31 ステップ進めることができます。

// initial seed, doesn't really matter which value you use
// as long as it's not zero (remember that the sequence goes over
// all the possible 31-bits values anyway)
private static final int SEED = 0x55555555;

private int state = SEED;

public int nextInt() throws SequenceCycleException {
    for (int i = 0; i < 31; ++i) {
        state = prbs31(state);
        if (state == SEED) {
            throw new SequenceCycleException();
        }
    }
    return state;
}

これにより、(2 31 -1)/31 の長さのランダムに見える整数のシーケンスが生成されます。

免責事項:単一の LFSR を単純に使用することは、非常に予測可能です。この場合、1 つの値を知ることで、将来のすべての値を知ることができます。これにより、この方法はシミュレーション (ゲームなど)には適していますが、暗号化または秘密の意味を持つものには非常に適していません!

個人的には、このメソッドを使用して、ハッシュ テーブルでキーとして使用されるオブジェクトの一意の ID を生成します。

于 2013-02-17T15:33:12.407 に答える
0

乱数を生成し、それをArray/ HashMap/ Whateverに格納して、返すことができます。次に、保存した古い番号に新しい番号がすでに含まれているかどうかを毎回確認する必要があります。あまり効率的ではありませんが、簡単です。

于 2012-04-27T05:47:55.483 に答える
0

最も簡単な方法は、クロック演算を使用することです。10 の因数ではない数 (素数など) を加算すると (差も因数ではありません)、ランダム ウォークですべての可能な値が得られます。それほどランダムではありませんが、非常に単純です。

たとえば、10 の値に対して 3 を選択するとします。

3, 6, 9, 2, 5, 8, 1, 4, 7, 0
于 2012-04-27T05:40:16.973 に答える
-2

乱数(整数)生成のコードサンプルです。Math.random()常に double 型の値を返すことがわかっているためです。だから、私はそれをintに変換しました。

class RNumber{
    public static void main(String str[]){
        int countNum=100;   
        for(int i=0;i<countNum;i++){
            System.out.println("Random Unique values="+(int)(Math.random()*100));
        }
    }
}

うまくいけば、それはあなたを助けるでしょう。

于 2012-04-27T05:43:37.400 に答える