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 shuffle是另一种方法:

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 回答
1

首先,您只听到 2 首歌曲,因为您randomnumber这一代仅限于 2 个值。

对于另一个问题,您可以创建一个带有随机放置曲目的可变数组并删除每个播放的元素。当计数达到 0 时,开始以随机顺序播放曲目。

于 2013-11-04T13:33:42.487 回答