Последовательные псевдослучайные числа через платформы

Если вы хотите, чтобы 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;

При желании вы можете изменить результат. Надеюсь, это поможет

28
задан Craig McQueen 11 November 2013 в 00:22
поделиться

4 ответа

Что-то вроде Mersenne Twister (из Boost.Random) детерминировано.

19
ответ дан 28 November 2019 в 03:40
поделиться

В быстро поисковой ссылке говорится:

Две разные инициализации с одним и тем же начальным значением, инструктируют псевдослучайный генератор генерировать одинаковую последовательность результатов для последующих вызовов to rand в обоих случаях.

Но вопрос остается. Я предполагаю, что приведенная выше спецификация применима только к ГСЧ в рамках одного процесса. Скорее всего, в нем ничего не говорится о кросс-платформенных или кросс-компиляторных вещах. Лучше всего, вероятно, найти библиотеку, доступную для всех желаемых платформ. Тогда вы должны быть в достаточной мере уверены, что если они будут иметь одинаковое значение, они вернут одну и ту же последовательность чисел.

0
ответ дан 28 November 2019 в 03:40
поделиться

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.

8
ответ дан 28 November 2019 в 03:40
поделиться

Самым простым способом было бы написать генератор случайных чисел, но использование библиотеки, выпущенной для разных платформ и гарантированно дающей те же результаты, также может работать.

Я сомневаюсь, rand () / srand () согласованы, но я этого не знаю.

0
ответ дан 28 November 2019 в 03:40
поделиться