我正在制作测验应用程序,我想在不重复的情况下生成随机数 我已经搜索了很多东西并得到了这个想法,但我认为我做错了,这就是为什么不能得到正确的输出。
这是我使用的代码。
-(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);
}
任何人都可以建议我在哪里错了吗?
答案 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;