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);
であるべきじゃないかな。