記事一覧

M系列

自分のメモ代わりにちょっとお勉強です。

M系列を用いて擬似乱数を発生させたくググってみました。
過去(15年近く前?)仕事で使った筈ですが記憶を呼び戻すのに一苦労(困)

単にrand()関数を使うより均一に乱数を発生(範囲内の並替)できるM系列の方が使い勝手良いのです。

どんなのに有効かと言うと沢山ある曲を並び替えて再生させたりするシャッフル再生とか呼ばれている機能がこれを用いている事が多いです。

続き
当時はアセンブラで書いていましたが、今回一番小さい組み合わせをCで書いてみたら意外と簡単ですね。

例、判りやすく記述すると

void main(){
  unsigned char reg,bit;

  reg = 1;
  while(1){
      reg = ((reg<<1) & 0x1E);       // 1bitシフトしマスク
      bit = (((reg & 0x10) >> 4)^
           ( (reg & 0x02)>>1) );   // bit4とbit1の排他的論理輪
      reg = ((reg & 0x0E) | bit);      // をbit0に代入とマスク
      printf("%02d\n",reg);
  }
}

上記をベースに32回転後終了する様に書き直しBorland C(※1)で実行してみました。
ファイル 630-1.gif
ソースファイル:test.zip
3→7→15→14→13→10→5→11→6→12→9→2→4→8→1→3→7・・・
と言う1~15の繰り返しが表示されると思います。
本当の乱数っぽく見せるにはもう一工夫必要ですが・・・。

私には、学が無いので導き出された周期(15,31,63,127・・・)を基に排他的論理和の組み合わせで実現できると言う事くらいで詳しい論理は判りません。

(bit)周期
(4,1)15
(5,2)31
(6,1)63
(7,3)127
(8,4,3,2)255
(9,4)511
(10,3)1023
(11,2)2047
(12,6,4,1)4095
(13,4,3,1)8191
(14,10,6,1)16383
(15,1)32767
(16,12,3,1)65535
(17,3)131071
(18,7)262143
(19,5,2,1)524287

はいおしまい(笑)

wikiipedia.org/wiki/線形帰還シフトレジスタ

※1.Borland Cは無料C++コンパイラです。興味ある方はググってみてください。(DLするにはユーザ登録必要)

コメント一覧

コメント投稿

  • コメントを入力して投稿ボタンを押してください。
  • スパム対策でコメントに挨拶のキーワードを含めて下さい。何度かチャレンジすれば通りますよ。
投稿フォーム
名前
Eメール
URL
コメント
削除キー
公開設定