Страницы

Поиск по вопросам

суббота, 27 октября 2018 г.

Arc4random не работает как должен

Как показывает гугление я не один столкнулся с этой проблемой:
в моем конкретном случае стояла задача сделать рандомным выпадение одной из двух карточек (симуляция выбора из двух игральных карт). При тестировании обнаружилось что одна карточка выпала 11 (!) раз подряд. При наличии выбора из трех карточек - одна из них выпала 6 раз подряд. Решил привязаться к миллисекундам времени нажатия клавиши выбора, и это в целом решило вопрос в более приемлемую сторону. Хочу поинтересоваться встречается ли данный вопрос у Вас (то есть не паранойя ли у меня) и если да то как с ним боретесь.
UPDATE: читая man для arc4random встречаю строки: "...The arc4random() function returns pseudo-random numbers in the range of 0 to (2**32)-1, and therefore has twice the range of rand(3) and random(3). ..." То есть все объяснимо, но не понял зачем тогда рандом который не является рандомным


Ответ

Нет, это не паранойя, а общая болезнь многих генераторов. Ваше решение является одним из самых распространенных и в достаточной мере решает проблему. Если же нужно увеличить порядок случайности, то необходимо будет воспользоваться кастомным рандомом, алгоритмы в сети есть, но тут увеличатся накладные расходы. Можете проверить С аналог, может результаты понравятся больше: srand(time(NULL)); int m = rand();

Комментариев нет:

Отправить комментарий