我正在制作一个测验应用。当用户开始测验时,随机问题就会出现在测验应用中。问题是,它不是随机的。它确实显示随机问题,但问题重复。我想确保他们不要重复到最后!我的代码是:
int Questions = arc4random_uniform(142);
switch (Questions) {
case 0:
break;
case 1:
break;
(...)
有没有更好的方法呢?一种不重复问题的方法?非常感谢你!
答案 0 :(得分:2)
shuffle可能是您的最佳解决方案:
// Setup
int questionCount = 10; // real number of questions
NSMutableArray *questionIndices = [NSMutableArray array];
for (int i = 0; i < questionCount; i++) {
[questionIndices addObject:@(i)];
}
// shuffle
for (int i = questionCount - 1; i > 0; --i) {
[questionIndices exchangeObjectAtIndex: i
withObjectAtIndex: arc4random_uniform((uint32_t)i + 1)];
}
// Simulate asking all questions
for (int i = 0; i < questionCount; i++) {
NSLog(@"questionIndex: %i", [questionIndices[i] intValue]);
}
NSLog output:
questionIndex: 6
questionIndex: 2
questionIndex: 4
questionIndex: 8
questionIndex: 3
questionIndex: 0
questionIndex: 1
questionIndex: 9
questionIndex: 7
questionIndex: 5
附录
在洗牌后打印实际文本的示例
// Setup
NSMutableArray *question = [NSMutableArray arrayWithObjects:
@"Q0 text", @"Q1 text", @"Q2 text", @"Q3 text", @"Q4 text",
@"Q5 text", @"Q6 text", @"Q7 text", @"Q8 text", @"Q9 text", nil];
// shuffle
for (int i = (int)[question count] - 1; i > 0; --i) {
[question exchangeObjectAtIndex: i
withObjectAtIndex: arc4random_uniform((uint32_t)i + 1)];
}
// Simulate asking all questions
for (int i = 0; i < [question count]; i++) {
printf("%s\n", [question[i] UTF8String]);
}
Sample output:
Q9 text
Q5 text
Q6 text
Q4 text
Q1 text
Q8 text
Q3 text
Q0 text
Q7 text
Q2 text
答案 1 :(得分:1)
这个想法是在使用所有问题之前使用每个问题一次。
示例代码。请注意,questionIndex不会重复。
// Setup
int questionCount = 10; // real number of questions
NSMutableArray *questionIndexes = [NSMutableArray array];
for (int i=0; i<questionCount; i++)
[questionIndexes addObject:@(i)];
// Simulate asking all questions
while (questionIndexes.count) {
// For each round
unsigned long arrayIndex = arc4random_uniform((uint32_t)questionIndexes.count);
int questionIndex = [questionIndexes[arrayIndex] intValue];
[questionIndexes removeObjectAtIndex:arrayIndex];
NSLog(@"arrayIndex: %lu, questionIndex: %i", arrayIndex, questionIndex);
}
NSLog输出:
arrayIndex:9,questionIndex:9
arrayIndex:5,questionIndex:5
arrayIndex:5,questionIndex:6
arrayIndex:3,questionIndex:3
arrayIndex:3,questionIndex:4
arrayIndex:4,questionIndex:8
arrayIndex:2,questionIndex:2
arrayIndex:0,questionIndex:0
arrayIndex:1,questionIndex:7
arrayIndex:0,questionIndex:1
答案 2 :(得分:0)
任何随机生成器实际上都是伪随机数。默认情况下,它从相同的初始值开始。为了使它“真正随机”,你应该为每次运行提供唯一的起始值,即“盐”。作为最简单的方法,您可以使用[NSDate timeIntervalSinceReferenceDate]。
答案 3 :(得分:0)
将您的问题放入数组中,并将随机数放在objectWithIndex
NSMutableArray
方法中。然后从数组中删除问题。无论何时选择索引,但不再有问题,请再试一次。