真正的随机Xcode

我目前正在测验应用程序。 当用户开始测验随机问题出现,就像你期望从一个测验应用程序。 问题是,这不是很随意。 它确实显示了随机问题,但重复的问题。 我想确保他们不会重复,直到最后! 我的代码是:

int Questions = arc4random_uniform(142); switch (Questions) { case 0: break; case 1: break; (...) 

有没有更好的方法来做到这一点? 一种不重复问题的方法? 非常感谢!

洗牌可能是你最好的解决scheme:

 // 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 

这个想法是使用每个问题一次,直到所有的问题已经被使用。

示例代码。 请注意,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

任何随机生成器实际上是伪随机的。 默认情况下,它是从相同的初始值开始的。 为了使它“真正的随机”你应该提供独特的开始价值,即“盐”为每个运行。 作为一个最简单的方法,你可以使用[NSDate timeIntervalSinceReferenceDate]。

把你的问题放在一个数组中,并把随机数放在NSMutableArrayobjectWithIndex方法中。 然后从数组中删除问题。 每当索引被选中,但是没有问题了,再试一次。