-3

わかりました..このような質問をするのは面倒だと思いますが、以下のコード [advance_reg(int*)] が本当にわかりません。コードのコメントでは、「/原始多項式(64,4,3,1,0)に従ってレジスタがステップする; /」と書かれていますが、わかりませんでした。このコードについてのヒントを教えてください。たとえば、なぜ adv_64 配列をそのように定義するのでしょうか? 最初のブロックが 27 回、1 ビットずつシフトされたことを理解しています。しかし、なぜ?この背後にある数学は何ですか?さらに、なぜ2番目のブロックを実行するのですか? これらはすべて、多項式 (64,4,3,1,0) と何を結び付けますか?

 static int bitcnt( int x) 
 {
    unsigned i=0,y;

    for (y=(unsigned)x; y; y &= (y-1) ) 
      i++;
    return(i);
 } 

 static void advance_reg(int *reg_fill)
 {
  const int mask = 0x1b;
  int adv_64[4][2];
  int i,new_fill[2];
  unsigned temp;

  adv_64[0][0] = 0xb0000000;
  adv_64[0][1] = 0x1b;
  adv_64[1][0] = 0x60000000;
  adv_64[1][1] = 0x2d;
  adv_64[2][0] = 0xc0000000;
  adv_64[2][1] = 0x5a;
  adv_64[3][0] = 0x80000000;
  adv_64[3][1] = 0xaf;
  new_fill[1] = new_fill[0] = 0;
  temp = mask<<27;

  for (i=27;i>=0;i--) 
  {
     new_fill[0] = (new_fill[0]<<1) | (1&bitcnt(reg_fill[0]&temp));
     new_fill[1] = (new_fill[1]<<1) | (1&bitcnt(reg_fill[1]&temp));
     temp >>= 1;
  }

  for (i=28;i<32;i++) 
  {
     temp = bitcnt(reg_fill[0]&(mask<<i));
     temp ^= bitcnt(reg_fill[1]&(mask>>(32-i)));
     new_fill[0] |= (1&temp)<<i;
     temp = bitcnt(reg_fill[0]&adv_64[i-28][0]);
     temp ^= bitcnt(reg_fill[1]&adv_64[i-28][1]);
     new_fill[1] |= (1&temp)<<i;
   }

  reg_fill[0] = new_fill[0];
  reg_fill[1] = new_fill[1];
  }
4

1 に答える 1

2

線形フィードバック シフト レジスタです。(または、説明を考えると、それが本来あるべきものです。)

このような関数は、バイナリ多項式で定義され、指定された 2 の累乗までの正の整数の固定された決定論的な順列を生成します。そのため、「ランダム」と呼ぶことができる最もランダムでないものの 1 つです。

于 2013-02-04T03:47:16.953 に答える