Понимание этого 16-битного ГПСЧ

Я нашел этот алгоритм для 16-битного ГПСЧ. Я не понимаю, что такое x, y и t. Что я хочу сделать, так это использовать 16-битное начальное число для генерации нескольких случайных 16-битных значений.

Если я прав, функция, показанная на этой веб-странице (приведенная ниже), является всего лишь псевдокодом, поскольку в ее нынешнем виде она всегда будет генерировать одно и то же значение, поскольку x и y являются локальными переменными для функции?

uint16_t rnd_xorshift_32() {
  static uint16_t x=1,y=1;
  uint16_t t=(x^(x<<5)); 
  x=y; 
  return y=(y^(y>>1))^(t^(t>>3));
}

Как можно изменить приведенное выше, чтобы прочитать глобальную переменную uint_16_t random (которая будет предварительно установлена ​​с помощью начального числа), а затем перезаписать ее следующим случайным значением?

Редактировать: Спасибо, мое понимание статических переменных было исправлено. Буду ли я прав, если скажу, что x и y изначально устанавливаются в начальное число (оба в 1 в приведенном выше коде), а затем изменяются, чтобы стать последующими случайными значениями? А t это временная переменная?


person CL22    schedule 03.08.2013    source источник
comment
Они статичны. Значения сохраняются между вызовами. Статическое объявление также используется только один раз, поэтому оно начинается с 1, больше не выполняется и сохраняется в памяти для следующего вызова.   -  person huseyin tugrul buyukisik    schedule 03.08.2013
comment
Это локальные переменные, но они не имеют автоматической длительности хранения - static означает, что x и y всегда относятся к одному и тому же экземпляру переменных, они сохраняются между вызовами функций.   -  person    schedule 03.08.2013
comment
возможный дубликат Что означает static в программе C?   -  person    schedule 03.08.2013


Ответы (1)


Переменные x и y на самом деле не являются "локальными" для функции в том смысле, который вы подразумеваете. Они объявлены как static, что означает, что хотя их область является локальной для функции (к ним нельзя получить доступ по имени извне), их срок жизни равен сроку действия всей программы. Таким образом, они сохранят свои значения между вызовами, что означает две вещи:

  • x и y на самом деле являются состоянием PRNG.
  • Функция не является потокобезопасной.
person John Zwinck    schedule 03.08.2013
comment
C99 6.2.4:3 для статической переменной: «Его время жизни — это все выполнение». Ваша альтернативная формулировка «от (не позднее) первого вызова функции до (не ранее) последнего» не короче, не проще и не эквивалентна официальной формулировке, когда адрес переменной передается и к ней обращаются после последний вызов функции, для которой он является локальным. - person Pascal Cuoq; 03.08.2013
comment
Спасибо за цитату. Не имея перед собой стандарта, я был намеренно консервативен, но ваша точка зрения понятна. Вы знаете, было ли то же самое до C99? - person John Zwinck; 03.08.2013
comment
Соответствующее предложение в C89: «Объект существует и сохраняет свое последнее сохраненное значение на протяжении всего выполнения всей программы». - person Pascal Cuoq; 03.08.2013