« YRDKRX63NというRX63N評価ボードを購入 | トップページ | KoboのJTAG配線を引き出してバウンダリスキャンする(1) »

2012.08.13

Xorshiftで乱数発生

Xorshiftという乱数発生アルゴリズムがあります。

http://ja.wikipedia.org/wiki/Xorshift

uint32_t xor128(void) { 
  static uint32_t x = 123456789;
  static uint32_t y = 362436069;
  static uint32_t z = 521288629;
  static uint32_t w = 88675123; 
  uint32_t t;
 
  t = x ^ (x << 11);
  x = y; y = z; z = w;
  return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 
}

32bitの内部変数を4つ持っていて、それをぐるぐる回しながらシフトさせて、Xorをとるという単純なアルゴリズムです。それで、周期が2^128-1というとても優れたものです。

このアルゴリズムはとてもFPGA向けだと思います。

なぜなら、

  • XORとSHIFTだけなので、LUTだけで作れる(内蔵乗算器が不要)
  • 加算も不要なので、桁上がりがなく、高速
  • 乱数が32bit単位で計算されてくる

今まで乱数生成用にLFSRを使っていましたが、LFSRだと1ビットごとにしか結果が出てこないのに対し、XORSHIFTなら32bit単位で出てくるので、とても使いやすいのです。

で、何をしようとしてこのアルゴリズムを使おうとしたかというと、特電SATA-IPコアのテストです。500GBのHDDを乱数で埋め尽くして、それをPCで読み出して読み書き内容の照合をしようとしています。

Sataxorshift

500GBのHDDということは、39bitにもなるので、周期が32bitやそこらの乱数では足りないわけです。単純なLFSRだと500GB埋める前に周期が来てしまいます。

そこで、簡単なアルゴリズムで、周期が長く、そこそこ優れた乱数を発生させる方法を探していてXORSHIFTに出会ったというわけです。

|

« YRDKRX63NというRX63N評価ボードを購入 | トップページ | KoboのJTAG配線を引き出してバウンダリスキャンする(1) »

コメント

コメントを書く



(ウェブ上には掲載しません)




« YRDKRX63NというRX63N評価ボードを購入 | トップページ | KoboのJTAG配線を引き出してバウンダリスキャンする(1) »