monkeyツールの乱数シード

昨日のデ部Ustを見ていて、monkeyツールのrandom seedについて議論があったので、Monkey.java*1を調べてみた。

  • verbose levelが1以上の時、Seedをlogに吐く。
  • verbose levelは-vオプションの数に等しい。
    • monkey -v -v -vでverbos level 3。
  • monkey -sでSeedを指定しない場合のデフォルト値は-1。
  • mRandomインスタンスは--randomize-throttleなどを指定した場合にも使い回されるので、再現性を求めるなら、指定するオプションも完全一致させる必要がある。


これ、デフォルト値-1が設定されるので、seedを与えなくても、生成される乱数列は毎回同じになるんじゃね?


こんなコードをHello Worldに埋め込んでエミュレータで実験してみた。

    SecureRandom sr = new SecureRandom();
    sr.setSeed(-1);
    for (int i=0 ; i<4 ; i++) {
      long l = sr.nextLong();
      System.out.println(l);
    }


1回目。

I/System.out( 413): -5016930203193634067
I/System.out( 413): -3643974259573985036
I/System.out( 413): 5907839790866025284
I/System.out( 413): 6981625101179673431


2回目。PIDが異なるので、プロセスは新規に生成されているはず。

I/System.out( 527): -5016930203193634067
I/System.out( 527): -3643974259573985036
I/System.out( 527): 5907839790866025284
I/System.out( 527): 6981625101179673431


3回目。エミュレータを再起動してみた。

I/System.out( 349): -5016930203193634067
I/System.out( 349): -3643974259573985036
I/System.out( 349): 5907839790866025284
I/System.out( 349): 6981625101179673431


まったく同じ結果
に。


setSeed(-1)をコメントアウトして実験。


1回目。

I/System.out( 414): 6822932661241022103
I/System.out( 414): 5358746818087779010
I/System.out( 414): -4362015058690887859
I/System.out( 414): 4871243452630524967


2回目。連続して実行。PIDは同じで、Life Cycleだけ回ってる。

I/System.out( 414): -5304354331753208905
I/System.out( 414): 2147412941124701195
I/System.out( 414): 7510597109857331964
I/System.out( 414): 2967048142811875505


3回目。PIDが違うので新規プロセス。

I/System.out( 457): 6055662423267597421
I/System.out( 457): 739041615359471551
I/System.out( 457): 7143595282741928130
I/System.out( 457): -1476730436998667919


しっかり乱数になっているようだ。


結論。

  • monkeyで再現性を意図したseedの設定は不要。
  • というか、monkeyで常にランダムな挙動を意図するなら、seedを指定しない場合にsetSeed(-1)するコードは間違っているんじゃ?


Monkey.javaの543行目。

        mRandom.setSeed((mSeed == 0) ? -1 : mSeed);

        if (mSeed != 0)
            mRandom.setSeed(mSeed);

であるべきじゃないかな。