0

現在、曲を再生するアプリを作成しています。ボタンがクリックされるたびにランダムな曲を再生したかったのです。私は現在持っています:

-(IBAction)currentMusic:(id)sender {
NSLog(@"Random Music");
int MusicRandom = arc4random_uniform(2);
switch (MusicRandom) {
    case 0:
        [audioPlayerN stop];
        [audioPlayer play];
        break;
    case 1:
        [audioPlayer stop];
        [audioPlayerN play];
        break;

しかし、私はすでに試しました:

- (IBAction)randomMusic:(id)sender {
NSLog(@"Random Music");




NSMutableArray * numberWithSet = [[NSMutableArray alloc]initWithCapacity:3];

int randomnumber = (arc4random() % 2)+1;



while ([numberWithSet containsObject:[NSNumber numberWithInt:randomnumber]])
{
    NSLog(@"Yes, they are the same");
    randomnumber = (arc4random() % 2)+1;
}

[numberWithSet addObject:[NSNumber numberWithInt:randomnumber]];




NSLog(@"numberWithSet : %@ \n\n",numberWithSet);
switch (randomnumber) {
    case 1:
        [audioPlayerN stop];
        [audioPlayer play];
        NSLog(@"1");
        break;
    case 2:
        [audioPlayer stop];
        [audioPlayerN play];

        NSLog(@"2");
        break;
    default:
        break;

}
}

そして、それらはすべて機能します。問題は、さらに曲を追加しても、繰り返されることです。繰り返さないランダムなコードが欲しかった。Like は 1 曲目、2 曲目、3 曲目、4 曲目、5 曲目をランダムに再生し、再生するとすべて再起動します。ループのように。しかし、私の現在のコードは、曲 1、曲 1、曲 2、曲 1、曲 2 などです...すべての曲を再生した場合を除いて、曲を繰り返さない方法はありますか? どうもありがとうございました。

4

2 に答える 2

2

ランダム順列を生成したい。

オプション1

このより単純なアプローチのための帽子のヒント@Alexander ...

if(![songsToPlay count])
    [songsToPlay addObjectsFromArray:songList];

int index = arc4random_uniform([songsToPlay count]);
playSong(songsToPlay[index]);
[songsToPlay removeObjectAtIndex:index];

簡単な説明:

  • NSMutableArray *songsToPlay: このラウンドでまだ再生されていない曲のリストを格納します。コンテンツのタイプは次のとおりです。
    • NSString、ファイル名の保存
    • NSNumber、曲のインデックスを保存する
  • NSArray *songList:再生したいすべての曲のリストを保存します。コンテンツは と同じタイプである必要がありsongsToPlayます。の場合もありますNSMutableArray
  • playSong(id songToPlay): 現在の曲と再生を停止しますsongToPlay。実装に依存するため、この関数を作成する必要があります。

オプション 2

Knuth シャッフルを使用することも別の方法です。

unsigned permute(unsigned permutation[], unsigned n)
{
    unsigned i;
    for (i = 0; i < n; i++) {
        unsigned j = arc4random_uniform(i);
        permutation[i] = permutation[j];
        permutation[j] = i;
    }
}

次に、曲をシャッフルするたびに関数を呼び出します。

int permutation[NUM_SONGS];

// I'm using a while loop just to demonstrate the idea.
// You'll need to adapt the code to track where you are
// in the permutation between button presses.
while(true) {
    for(int i = 0; i < NUM_SONGS; ++i)
        permutation[i] = i;

    permute(permutation, NUM_SONGS);

    for(int i = 0; i < NUM_SONGS; ++i) {
        int songNum = permutation[i];
        playSong(songNum);
    }
    waitForButtonPress();
}
于 2013-11-04T13:36:42.357 に答える