Вы стоите в темнице. Перед вами группа ботаников 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 , но как только у меня есть эта константа, я не уверен, куда дальше двигаться. Как-то хешировать все числа с помощью моей константы? Это даст гораздо большее число; Я статистически в порядке, если я просто усекаю или модулирую это до броска костей? Я не знаю, какие алгоритмические шаги предпринять.