Самое простое, что вы можете сделать, кроме написания другого PRNG или использования библиотеки, - это просто использовать все биты, которые дает вам один вызов rand()
. Большинство генераторов случайных чисел можно разбить на поток битов, который имеет определенные случайные и статистические свойства. Отдельные биты, расположенные равномерно в этом потоке, не обязательно должны иметь одинаковые свойства. По сути, вы отбрасываете от 14 до 31 бита псевдослучайности здесь.
Вы можете просто кешировать число, сгенерированное вызовом, в rand()
и использовать каждый его бит (в зависимости от количества бит, которое rand()
дает вам, конечно, что будет зависеть от RAND_MAX
). Таким образом, если ваш RAND_MAX
равен 32768, вы можете использовать 15 младших битов этого числа в последовательности. Особенно, если RAND_MAX
настолько мал, что вы не имеете дело с младшими битами генератора, поэтому получение битов из старшего класса не принесет вам большой пользы. Например, Microsoft CRT генерирует случайные числа с помощью уравнения
x n + 1 = x n & middot; 214013 + 2531011
, а затем сдвигает 16 младших битов этого результата и ограничивает его 15 битами. Так что никаких младших битов от генератора нет. Это в основном справедливо для генераторов, где RAND_MAX
достигает 2 31 , но иногда вы не можете рассчитывать на это (поэтому, возможно, ограничитесь 16 или 24 битами, взятыми из старшего уровня) ).
Так, обычно, просто кешируйте результат вызова rand()
и используйте биты этого числа последовательно для вашего приложения вместо rand() % 2
.