На другой ноте этот код:
rand()%6
обычно считается плохой практикой. младшие биты rand () значительно менее случайны, чем старшие биты. Вы получите лучшую случайность, если сделаете:
(rand() >> 8)%6
например.
EDIT:
Подробнее об этом см. в этой заметке , а также в статье Dr. Журнал Доббса , который хотя бы намекает на причину:
Примечание: НЕ использовать
y = rand() % M;
, поскольку это фокусируется на младших битах
Rand (). Для линейного конгруэнтного случайного
генераторы чисел, которые rand () часто
младшие байты намного меньше
случайным, чем старшие байты. по факту
младшие битовые циклы между 0 и 1.
Таким образом, rand () может переключаться между четным и
странно (попробуйте) Примечание rand () не
должен быть линейным конгруэнтным
генератор случайных чисел. Это
вполне допустимо для него быть
что-то лучшее, чего нет
эта проблема.
DDJ:
Наиболее важным моментом является то, что
младшие биты выхода из
обычный (линейный конгруэнтный) случайный
генераторы чисел наименее
«Случайный». То есть шаблоны в
младшие биты являются общими. Следовательно
выход из рулона в вашем
обсуждение не удивительно. Кроме того, это
можно избежать, полагаясь на верхнюю
биты для определения целого числа
вернулся.
Например, если вы хотите выбрать случайное «истинное» или «ложное» значение, и вы использовали код:
rand() % 2
Тогда вы можете увидеть шаблон результатов:
1,0,1,0,1,0,1,0,1,0 (и т. Д.)
Это, очевидно, не так уж случайно, но это свойство линейного конгруэнтного генератора, которое может использоваться. В целом, лучшая схема (для C ++) может заключаться в использовании библиотеки Boost.Random , которая поддерживает все виды подключаемых случайных генераторов (включая Mersenne Twister, у которого нет этой ошибки).