Повышение качества случайности в цели-C

Вы стоите в темнице. Перед вами группа ботаников 5 уровня. Они хотят, чтобы вы провели для них кампанию «Подземелья и драконы».

Вы проводите несколько сессий, ваши игроки повышаются, и в целом дела идут хорошо. Хотя бой немного медленный. Вы решаете достать свою +4 Алебарду цели-C и написать приложение для iPad, чтобы автоматизировать бросание кубиков NPC в бою. Ботаны угрожающе движутся к вам. «Алгоритмически сгенерированные числа, - рычит кто-то, - являются пустой имитацией истинной случайности! Вы не должны запятнать нашу священную кампанию своей псевдослучайной мерзостью!»

Вы делаете бросок, чтобы убедить его, что arc4random_uniform () является более чем достаточно ... и не получится. Ботаны довольствуются не чем иным, как настоящей случайностью. Они держат вас в плену, пока вы отчаянно цепляетесь за свой MacBook, и пишете класс, который извлекает данные с random.org.

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY/YYYY-MM-dd"];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@%@", 
                @"http://www.random.org/files/", 
                [formatter stringFromDate:[NSDate date]],
                @".bin"]];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:
                [NSURLRequest requestWithURL:url] delegate:self];

После сохранения данных вы разрешаете генерацию случайных чисел от 0 до 255 из загруженных байтов.

-(int) nextInt:(int)start end:(int)end
{
    int upperBound = end - start + 1;
    unsigned char result;
    int maxModulo = 255 - (255 % upperBound);
    do {
        NSRange range = {index, sizeof(char)};
        [randos getBytes:&result range:range];
        index += sizeof(char);
    } while (result > maxModulo); //avoid modulo bias
    result = result % upperBound;
    result += start;
    return result;
}

Ботаны кажутся довольными, но появляется новый враг: еще один Мастер Подземелий! Он требует, чтобы вы дали ему копию программы для его собственных целей. Проблема очевидна - если вы оба используете данные random.org за один и тот же день, вы получите одинаковый набор бросков костей!

Итак, у меня следующий вопрос: как я могу изменить случайное.org, чтобы они сохраняли что-то вроде «истинной случайности», но были разными в каждом экземпляре программы? Я могу представить себе одно решение, которое повлечет за собой получение от пользователя некоторых (предположительно случайных) движений сенсорной панели , как это делает TrueCrypt , но как только у меня есть эта константа, я не уверен, куда дальше двигаться. Как-то хешировать все числа с помощью моей константы? Это даст гораздо большее число; Я статистически в порядке, если я просто усекаю или модулирую это до броска костей? Я не знаю, какие алгоритмические шаги предпринять.

9
задан iameli 11 October 2011 в 16:03
поделиться