Как сказано в справочной странице Linux для rand()
:
Однако в более старых реализациях rand () и в текущих реализациях в разных системах биты младшего разряда намного менее случайны, чем биты старшего разряда. Не используйте эту функцию в приложениях, предназначенных для переноса, когда необходима хорошая случайность.
Таким образом, вы можете захотеть использовать другой генератор случайных чисел или вытянуть биты более высокого порядка (которые могут демонстрировать большую случайность).
Типичная реализация rand()
представляет собой линейный конгруэнтный генератор , который представляет собой не что иное, как умножение и сложение некоторых чисел со специальными свойствами (относительная простота). Например, пара реализаций:
MSVC 2010 rand()
:
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
rand()
из рабочей среды IAR:
(x) * 1664525L + 1013904223L
Вы заметите, что rand()
в MSVC 2010 сдвигает результат вправо, я полагаю, чтобы помочь с проблемой, описанной в справочной странице Linux о неслучайности в младших битах.
Однако, если вы хотите улучшить случайность своих результатов, вы можете захотеть использовать подпрограмму, основанную на чем-то вроде Mersenne twister , для которой реализации легко доступны в Интернете.