C 理解这个16位PRNG

C 理解这个16位PRNG,c,16-bit,prng,unsigned-integer,C,16 Bit,Prng,Unsigned Integer,我找到了一个16位PRNG。我不明白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)); }

我找到了一个16位PRNG。我不明白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));
}
uint16\u t rnd\u xorshift\u 32(){
静态uint16_t x=1,y=1;
uint16_t t=(x^(x1))^(t^(t>>3));
}
如何修改上述内容以读取全局变量
uint_16_t random
(该变量已用种子预先设置),然后用下一个随机值覆盖它


编辑:谢谢,因此我对静态变量的理解已被更正。我说
x
y
最初设置为种子(在上述代码中都设置为
1
),然后修改为随后的随机值,这样说是否正确?而
t
是一个临时变量?

变量
x
y
在您暗示的意义上并不是函数的真正“局部”。它们被声明为
static
,这意味着虽然它们的作用域是函数的局部(不能从外部通过名称访问),但它们的生命周期是整个程序的生命周期。因此,它们将在调用之间保留其值,这意味着两件事:

  • x和y实际上是PRNG状态
  • 该函数不是线程安全的

它们是静态的。在调用之间保留值。静态声明也只使用一次,因此它从1开始,不再执行,并保存在内存中以备下次调用。它们是本地变量,但没有自动存储持续时间-
Static
意味着
x
y
始终引用相同的变量实例,它们在函数调用之间保持不变。在静态变量上可能重复C99 6.2.4:3:“它的生命周期是整个执行过程”。您的替代公式“从(不迟于)函数的第一次调用到(不早于)最后一次调用”并不短,也不简单,也不等同于正式公式,当变量的地址在函数的最后一次本地调用后被传递和访问时。谢谢您的引用。没有标准摆在我面前,我是故意保守,但你的观点是正确的。你知道它在C99之前是否是相同的吗?C89中对应的句子是“对象存在并在整个程序执行过程中保留其最后存储的值。”