2

この方法をテストしたい:ArrayList<File> songs;

public void playRandomSong()
{
    Random random = new Random();
    int iNextSong = random.nextInt(songs.size());
    File songToPlay = songs.get(iNextSong);
    if (mediaPlayer != null && mediaPlayer.isPlaying())
        mediaPlayer.stop();
    mediaPlayer = new MediaPlayerImpl(songToPlay, new WhenDone());
    mediaPlayer.play();
    currentSong = songToPlay;
}

私はこのように考えています: メソッドを複数回実行し、要素の 1 つが複数回返されるかどうかを確認します。しかし、それをコードでどのように記述すればよいでしょうか。

4

4 に答える 4

4

メソッドでRNGを作成する代わりに

public void playRandomSong() {
  Random random = new Random();
  ...
}

ランダム性のソースを渡す必要があります(これは依存性注入と呼ばれます)

public void playRandomSong(Random random) {
  ...
}

Random次に、単体テストで既知のシードを使用してインスタンスを生成し、再現性はあるが典型的な結果を得ることができます。

public void testPlayRandomSong() {
  Random random = new Random(0xd5021e90339050ab);

  // Test that 1000 runs plays each song roughly the right number of times.
  ...
}
于 2012-11-10T06:40:43.460 に答える
4

ランダムは、同じ値を2回返さないことを保証するものではありません...したがって、テストすることはできません"see if it returns one of the elements more than once"

必要に応じて、Set周りを実装する必要がありますがRandom、誕生日のパラドックスに注意してください...

2つの選択肢があると思います。

Random1:シーケンスを予測できるように、シードを試みることができます。

2:ランダムを削除し、を使用し[Collections.shuffle][1]てarrayListをシャッフルします

オプション1では、メソッドのシグネチャを変更する必要があります。

オプション2を使用すると、すべての曲を1回再生することもできます。

于 2012-11-09T20:34:37.700 に答える
2

あなたのコードには別の問題があります。ランダムな順序で曲を再生したい場合は、間違った方法でやっています。このアルゴリズムは、リスト内のすべての曲が再生されるまで、曲を繰り返さないようにする必要があります。これを実現するために、Knuth shuffle と呼ばれるアルゴリズムがあります。Collectionsクラスから取得できます: java.util.Collections#shuffle.

于 2012-11-09T21:06:26.433 に答える
0

役立つと思われるランダム性検定に関する記事は次のとおりです。

http://beust.com/weblog/2012/02/20/various-ways-to-get-randomness-wrong/

于 2012-11-10T06:36:53.257 に答える