1

16 ビット PRNG 用のこのアルゴリズムを見つけました。x、y、t が何なのかわかりません。私がやりたいことは、16 ビットのシードを使用して、複数のランダムな 16 ビット値を生成することです。

私が正しければ、その Web ページ (以下に引用) に示されている関数は疑似コードにすぎません。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と言うのは正しいでしょうか? そして、一時変数ですか?y1t

4

1 に答える 1

3

変数xyは、あなたが暗示している意味で、関数に対して真に「ローカル」ではありません。staticこれらは、そのスコープが関数に対してローカルである (外部から名前でアクセスできない) 間、その有効期間がプログラム全体のものであることを意味するとして宣言されています。したがって、それらは呼び出し間で値を保持します。これは、次の 2 つのことを意味します。

  • x と y は実際には PRNG 状態です。
  • 関数はスレッドセーフではありません。
于 2013-08-03T12:42:28.513 に答える