随机数不重复

时间:2012-05-11 08:31:09

标签: iphone xcode random

我正在制作测验应用程序,我想在不重复的情况下生成随机数 我已经搜索了很多东西并得到了这个想法,但我认为我做错了,这就是为什么不能得到正确的输出。

这是我使用的代码。

-(int)generater{

NSMutableArray *temp;
srand([[NSDate date] timeIntervalSince1970]);
r = 1 + (arc4random() % 11);

if ([temp count] ==0) {

    [temp addObject:[NSNumber numberWithInteger:questionnumber]];
    return r;

}
if ([temp count] >= 1 ){

    if (![temp containsObject:[NSNumber numberWithInteger:questionnumber]]) {

        return r;

    }
    else{

        int next=[self generater];
        return next;
    }
}
return r;
}  

下一个问题,

-(void)askQuestion{

[self generater];

questionnumber = r;

NSInteger row = 0;
if(questionnumber == 1)
{
    row = questionnumber - 1;
}
else
{
    row = ((questionnumber - 1) * 11);
}

任何人都可以建议我在哪里错了吗?

6 个答案:

答案 0 :(得分:4)

    arryRandomNumber=[[NSMutableArray alloc]init];
    while (arryRandomNumber.count<12) {
    NSInteger randomNumber=1+arc4random()%12;
    if (![arryRandomNumber containsObject:[NSString stringWithFormat:@"%d",randomNumber]])       {
          [arryRandomNumber addObject:[NSString stringWithFormat:@"%d",randomNumber]];
     }
         continue;
    }
     NSLog(@"%@",arryRandomNumber);

答案 1 :(得分:3)

当然,最好的方法是将所有问题(或问题编号)按顺序放入数组中,然后将它们随机播放。

请参阅What's the Best Way to Shuffle an NSMutableArray?

一些额外的指导(NB所有代码都写在浏览器中,而不是实际编译和测试;但仍然应该得到要点):

1)设置ivar NSMutableArray *randomQuestionNumbers。使用问题数量初始化数组的内容,因此,如果您有5个问题,请将数字1-5放入。要手动执行,请执行以下操作:

randomQuestionNumbers = [NSMutableArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], [NSNumber numberWithInt:4], [NSNumber numberWithInt:5], nil];

2)之后,您需要使用上面链接中给出的方法之一进行随机播放。 这将改变[1,2,3,4,5] - &gt; [4,1,5,3,2]例如 3)所以现在创建你的方法来获得下一个问题编号:

- (NSInteger) nextQuestionNumber {

  NSInteger nextQuestionNumber = -1;
  if ([randomQuestionNumbers count] > 0) {
      nextQuestionNumber = (NSInteger) [randomQuestionNumbers objectAtIndex:0];
      [randomQuestionNumbers removeObjectAtIndex:0];
  }
  return nextQuestionNumber;
}

这里发生的是我们检索数组中的第一个int。然后我们从数组中删除该元素。最后,我们返回int,例如4.下次调用该方法时,只有一个元素,第一个元素是int 1,依此类推。我粗略地使用-1来显示数组是否为空,但说实话,你应该能够确保你不会在必要时多次调用该方法。

答案 2 :(得分:1)

希望这段代码可以帮助你......

此处 限制 应根据您的要求设置。

此代码的好处是它不会重复已经获得的相同随机数。 ( 没有重复的数字

srand(time(NULL));

int randomIndex = rand() % limit;

[reportIDTextField setText:[NSString stringWithFormat:@"%i", randomIndex]];

享受编码:)

答案 3 :(得分:1)

两个数字之间的随机数方法:

- (int)randomFromSmallest: (int) smallest toLargest: (int) largest
{
    int random = smallest + arc4random() % (largest + 1 - smallest);
    return random;
}

这就是我填充一系列非重复数字的方法:

NSMutableArray *randNrArray = [[NSMutableArray alloc] init];

while ([randNrArray count] < 25)
{
    int rndNumber = [self randomFromSmallest:0 toLargest:25 - 1];

    if (![randNrArray containsObject:[NSNumber numberWithInt:rndNumber]])
    {
        [randNrArray addObject:[NSNumber numberWithInt:rndNumber]];
        //NSLog(@"___ %d ___", rndNumber);
    }
}

我希望这会有所帮助。

答案 4 :(得分:0)

将所有问题编号放在NSMutableArray(1,2,3,4,5,6,7,8)中,然后在此阵列上执行多项排列。

我使用这种方法来扰乱数字小键盘:

// Randomize keys: exchange two random keys, ten times.
for (int i = 0; i < 10; i++)
{
    int a = 0, b = 0;
    while (a == b)
    {
        a = arc4random() % 10;
        b = arc4random() % 10;
    }
    UIButton *btnA = (UIButton *)[_scrambledKeypad viewWithTag:a + 10];
    UIButton *btnB = (UIButton *)[_scrambledKeypad viewWithTag:b + 10];
    CGRect frame = btnA.frame;
    btnA.frame = btnB.frame;
    btnB.frame = frame;
}

答案 5 :(得分:0)

也许:     r = [自我生成器];

questionnumber = r;