真随机Xcode

时间:2013-11-09 19:26:15

标签: ios iphone xcode random arc4random

我正在制作一个测验应用。当用户开始测验时,随机问题就会出现在测验应用中。问题是,它不是随机的。它确实显示随机问题,但问题重复。我想确保他们不要重复到最后!我的代码是:

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

        break;

    case 1:
        break;

(...)

有没有更好的方法呢?一种不重复问题的方法?非常感谢你!

4 个答案:

答案 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方法中。然后从数组中删除问题。无论何时选择索引,但不再有问题,请再试一次。