真正的随机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]。
把你的问题放在一个数组中,并把随机数放在NSMutableArray
的objectWithIndex
方法中。 然后从数组中删除问题。 每当索引被选中,但是没有问题了,再试一次。