3

簡単な PRNG プロジェクトを実行中。Math.pow の奇妙な動作に遭遇し、単純に数値を掛け合わせました。これの原因は何ですか?PRNG クラスと、プログラムの実行に使用したメイン クラスを含めました。結果を比較すると、最初はうまくいきましたが、3 回目の繰り返しで、乗算 PRNG が Math.pow() PRNG から分岐しています。乗法PRNGも負の数を与え始めます。それはすべきではありません。

public class PRNG {
int seed;
/**
 * Creates a PRNG with the seed x0
 */
public PRNG(int x0){
    this.seed = x0;
}

/**
 * Return the next random number
 */
public int nextRand(){
    //seed = (int) ((Math.pow(7, 5) * seed) % (Math.pow(2, 31) - 1));
    seed = (int) ((7*7*7*7*7 * seed) % (Math.pow(2, 31) - 1));
    return seed;
} 

}

主要:

public class main {
final static int SEED = 1;

public static void main(String[] args) {
    PRNG prng = new PRNG(SEED);     

    for(int i = 0; i < 100; i++){
        System.out.println(prng.nextRand());
    }
}

}

前もって感謝します!

4

3 に答える 3

11

これは、シードの INT 値をオーバーフローしているためです。

コードを次のように変更します。

seed = (int) ((7*7*7*7*7 * (long)seed) % (Math.pow(2, 31) - 1));

問題を修正します。

于 2013-10-01T19:48:09.917 に答える
0

あなたの質問のタイトルに対処するには、違いはありません。

public class MathPow {
    public static void main(String[] args) {
        testInt();
        testLong();
    }

    private static void testInt(){
        int a = 7*7*7*7*7;
        int b = (int) Math.pow(7,5);
        System.out.printf("a=%d b=%d (a==b)=%b\n", a, b, a==b);
    }
    private static void testLong(){
        long a = 7*7*7*7*7;
        long b = (long) Math.pow(7,5);
        System.out.printf("a=%d b=%d (a==b)=%b\n", a, b, a==b);
    }
}

出力を生成します。

a=16807 b=16807 (a==b)=true
a=16807 b=16807 (a==b)=true
于 2013-10-01T19:50:56.133 に答える
0

投稿のタイトルではなく、関心のある行動に対処するには:

評価の手順:

seed = (int) ((Math.pow(7, 5) * seed) % (Math.pow(2, 31) - 1));
  • Math.pow(7, 5) = double (16807)
  • double * int = double (64 ビット)
  • Math.pow(2,31) = double
  • double - int = double
  • ダブル % ダブル = ダブル
  • double は int にキャストされます

seed = (int) ((7*7*7*7*7 * seed) % (Math.pow(2, 31) - 1));

  • 7*7*7*7*7 = 整数 (16807)
  • int * int = int // ここで整数の値をオーバーフローします。
  • Math.pow(2,31) = double
  • double - int = double
  • int % double = double
  • double は int にキャストされます

デモンストレーションするには:

public class MathPow {
    static int seed=1;

    public static void main(String[] args) {
        System.out.println("7*7*7*7*7");
        whatType(7*7*7*7*7);
        whatType(7*7*7*7*7*seed);
        whatType(Math.pow(2,31));
        whatType(Math.pow(2,31)-1);
        whatType(((7*7*7*7*7 * seed) % (Math.pow(2, 31) - 1)));

        System.out.println("Math.pow(7,5)");
        whatType(Math.pow(7,5));
        whatType(Math.pow(7,5) * seed);
        whatType(Math.pow(2,31));
        whatType(Math.pow(2,31)-1);
        whatType((Math.pow(7, 5) * seed) % (Math.pow(2, 31) - 1));

    }
    private static void whatType(Object o){
        System.out.println(o.getClass());
    }
}

出力:

7*7*7*7*7
class java.lang.Integer
class java.lang.Integer
class java.lang.Double
class java.lang.Double
class java.lang.Double
Math.pow(7,5)
class java.lang.Double
class java.lang.Double
class java.lang.Double
class java.lang.Double
class java.lang.Double
于 2013-10-01T20:08:28.797 に答える