Если вы хотите, чтобы n битов было определенным, то вы могли бы сначала создать битовую маску, а затем AND
с вашим номером взять желаемые биты.
Простая функция для создания маски от бита а до бита.
unsigned createMask(unsigned a, unsigned b)
{
unsigned r = 0;
for (unsigned i=a; i<=b; i++)
r |= 1 << i;
return r;
}
Вы должны проверить, что a < = b.
Если вы хотите, чтобы биты с 12 по 16 вызывали функцию, а затем просто & amp; (логическое И) r
с вашим номером N
r = createMask(12,16);
unsigned result = r & N;
При желании вы можете изменить результат. Надеюсь, это поможет
Что-то вроде Mersenne Twister (из Boost.Random) детерминировано.
В быстро поисковой ссылке говорится:
Две разные инициализации с одним и тем же начальным значением, инструктируют псевдослучайный генератор генерировать одинаковую последовательность результатов для последующих вызовов to rand в обоих случаях.
Но вопрос остается. Я предполагаю, что приведенная выше спецификация применима только к ГСЧ в рамках одного процесса. Скорее всего, в нем ничего не говорится о кросс-платформенных или кросс-компиляторных вещах. Лучше всего, вероятно, найти библиотеку, доступную для всех желаемых платформ. Тогда вы должны быть в достаточной мере уверены, что если они будут иметь одинаковое значение, они вернут одну и ту же последовательность чисел.
Knuth has released into the public domain C (and FORTRAN) source code for the pseudo-random number generator described in section 3.6 of The Art of Computer Programming.
Самым простым способом было бы написать генератор случайных чисел, но использование библиотеки, выпущенной для разных платформ и гарантированно дающей те же результаты, также может работать.
Я сомневаюсь, rand () / srand () согласованы, но я этого не знаю.