首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机整数环

随机整数环
EN

Stack Overflow用户
提问于 2013-11-04 13:28:15
回答 2查看 211关注 0票数 0

我目前正在制作一个播放歌曲的应用程序。我想播放一首随机歌曲,每一个按钮被点击。我目前有:

代码语言:javascript
复制
-(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;

,但我已经试过了:

代码语言:javascript
复制
- (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;

}
}

所有这些都有效,问题是,即使我会添加更多的歌曲,他们重复。我想要一个不会重复的随机代码。就像播放歌曲1、歌曲2、歌曲3、歌曲4和歌曲5一样,当播放时,它们都会重新启动。就像个环路。但是我现在的代码就像歌曲1,歌曲1,歌曲2,歌曲1,歌曲2,所以on...Is有什么办法不重复这些歌曲,除非所有的歌曲都已经播放了?非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-04 13:36:42

你想要产生一个随机排列。

选项1

Hat @Alexander表示这种简单的方法..。

代码语言:javascript
复制
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

使用克努斯洗牌是另一种方法:

代码语言:javascript
复制
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;
    }
}

然后,每次您想要洗牌歌曲时都调用该函数:

代码语言:javascript
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-04 13:33:42

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19768714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档