3

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

这是我使用的代码。

-(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);
}

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

4

6 回答 6

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);
于 2012-12-21T11:41:59.150 回答
3

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

请参阅随机播放 NSMutableArray 的最佳方法是什么?

一些额外的指导(注意所有代码都是在浏览器中编写的,没有实际编译和测试;但仍应了解要点):

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] -> [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 来显示数组何时为空,但老实说,您应该能够确保您不会多次调用该方法。

于 2012-05-11T08:35:21.853 回答
1

希望这段代码能帮到你...

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

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

srand(time(NULL));

int randomIndex = rand() % limit;

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

享受编码:)

于 2012-05-13T07:48:24.490 回答
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);
    }
}

我希望这有帮助。

于 2014-09-09T10:30:37.617 回答
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;
}
于 2012-05-11T08:34:51.303 回答
0

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

questionnumber = r;
于 2012-05-11T08:35:06.620 回答