Как получить качественные случайные числа на iPhone или iPad? - PullRequest
3 голосов
/ 05 февраля 2011

Я знаю, что arc4random () считается одним из лучших вариантов случайности. Но, тем не менее, он иногда дает явные дубликаты и повторения.

Я подумал об использовании акселерометров для добавления некоторой реальной случайности к выходу arc4random. Прежде чем потратить несколько недель на разработку лучшего решения: какие другие решения доступны?

Ответы [ 5 ]

6 голосов
/ 05 февраля 2011

Дубликаты и повторы ожидаются от случайного потока чисел. Попытка добавить «больше случайности» не нужна; arc4random уже читает из / dev / urandom, который собирает энтропию из различных источников в системе.

5 голосов
/ 05 февраля 2011

Если вы пытаетесь избавиться от дубликатов и повторений (особенно от последовательностей arc4random длиной менее миллионов), вы, вероятно, получите гораздо менее случайную последовательность. Обычная человеческая ментальная ошибка - ожидать меньше повторений в истинной случайности.

Если вам не нужны дубликаты для какой-либо цели, вы должны выполнить произвольную сортировку массива без дубликатов элементов, как при перемешивании карты.

4 голосов
/ 05 февраля 2011

В ответ на ваш актуальный вопрос, если вы хотите что-то лучше, чем arc4random (), посмотрите на

mersenne twister

что в определенном смысле "лучше". Надеюсь, это поможет!


Я также призываю всех, кто не знаком с этой темой, прочитать один из самых известных ответов о переполнении стека, который хорошо объясняет распределение, даже с графиками!

Понимание "случайности"

" Никогда, никогда не добавляйте и не умножайте случайные числа в попытке получить" лучшую "случайность" - короткая версия.

2 голосов
/ 17 июня 2012

Если вы хотите циклически перебирать свой список «на первый взгляд» и избегать повторения какого-либо элемента ... используйте arc4random (), и после того, как каждый элемент был просмотрен, удалите его из списка.Когда список иссякнет, перезагрузите его.

Пример:

if (!self.dictionaryValues) {
[self loadList];

} else {

NSMutableDictionary *unusedValueList = [[NSMutableDictionary alloc] initWithDictionary:self.dictionaryValues];

int random = arc4random()%[self.dictionaryValues count]; // note, crashes on nil;
int i=0;
for (NSString *key in self.dictionaryValues) {
        i++;
        if (i == random) {
            NSLog(@"MATCH! on key=%@", key);
            [unusedValueList removeObjectForKey:key];
        }
}
self.dictionaryValues = nil;
self.dictionaryValues = unusedValueList;

}

надеюсь, это поможет!

0 голосов
/ 05 февраля 2011

У меня был длинный ответ, но я просто собираюсь дать ссылку на это. Потому что это в основном подводит итог всему, что неправильно, пытаясь сделать случайные числа «более случайными»

http://thedailywtf.com/Articles/More-Entropy,-Please.aspx

...