2012-05-11 77 views
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
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); 
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; 
} 
0

也许: R = [自generater];

questionnumber = r; 
+0

不...重复数字..! – iUser

+0

generater()方法在哪里? –

2

当然最好的办法是把所有的问题(或问题数)依次到一个数组,然后洗牌他们。

What's the Best Way to Shuffle an NSMutableArray?

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

1)建立伊娃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显示当数组是空的,但说实话,你应该能够确保您不会调用该方法多次必要的。

+0

感谢您的链接arooaroo。我查看了链接,我知道我可以交换数组的对象索引以获得随机数,但我不知道如何应用于我的情况。你能否给我一些提示/解释我可以用在我的案例中的一些编码。 – iUser

+0

好的,我添加了更多信息来引导您朝着正确的方向发展。 – arooaroo

1

希望这个代码将会帮助你......

这里限制应该由你的要求设置。

效益这个代码是不会重复这已经得到了相同的随机数。(无重复号

srand(time(NULL)); 

int randomIndex = rand() % limit; 

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

享受编码号:)

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

我希望这有助于。