ソラマメブログ
プロフィール
ぺんぎん
ぺんぎん
どもっす( ◎v◎ )
ぺんぎんっす。

「ぺんぎんさん」でいいっす。
「ぺんさん」でもOKっすよ。
何だって良いんっすけどね。
[個体名:Naoya Bellic]
(非商用)
※カテゴリー別のRSSです
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 1人

  

Posted by at

2009年01月08日

xorshift_i,fに間違い発見っす

右シフトの所が違ってたっす。
申し訳ないっす・・・
どうもぺんぎんっす( ◎v◎ )


コードも直したっす。
修正版の方が忠実っす。

簡単に解説するっす。
論文中のCのプログラムではunsignedが使われてるっす。
これを右シフトすると、空いた左側には0が入るっす。

一方SLのintegerは右シフトすると、最上位bit(以降MSB)が
0の場合:空いた左側には0
1の場合:空いた左側には1 が入るっす。

1が左側に入ると論文のアルゴリズムとは異なってしまうので、
XORをとってたっす。
( x = x ^ ((x >> 17) ^ 0xFFFF8000)ってやってたっす。)
確かにこのやり方だと、MSBが1の場合は合ってるっす。
でも、MSBが0の場合は左側のbitが1になっちゃうっす。

そこで、
x = x ^ ((x >> 17) & 0x00007FFF);
っていう風に修正したっす。
0x00007FFFっていう数は上位17bitが0で、下位bitは1っす。
これなら右シフトして空いた所には0が入って、他は変わらないっす。



--オマケ--
integer 型のsを右にtビット、シフトする
(unsignedのときと同様に、左には0を入れる)

s = (s >> t) & ~((0x1 << t) -1 << 32-t);


上に書いた通り、上位tビットが0で下位ビットが1の数と
&演算をすることで実現できるっす。
この数を出してるのがちょっとややこしい演算っす。

(0x1 << t) -1
これで下位tビットは1、上位32-tビットが0の数ができるっす。
これを32-tビット左に移動させる(<< 32-t)と、
上位tビットは1、下位32-tビットが0になるっす。
最後に反転させて上位tビットが0で下位32-tビットが1の数の完成っす。

もしもtが分かっているなら、0x00007FFF(t=17の場合)みたいに
&演算する数は簡単に書けるっす。  


Posted by ぺんぎん at 23:14Comments(0)LSL-Con2008

2008年12月21日

10月23日っす

すっかり忘れてたっす。
コードリーディングのソースっす。

使用される際はコメント行も持って行ってくださいっす。
このコードはGPL2っす。
要注意っす。


/////////////////////////////////////////////////////////////////////////////////////
// Xorshift RNGs は2003年にGeorge Marsaglia 氏によって考案されました。
// George Marsaglia [2003] proposed a class of very fast uniform random number generators (RNGs).
// copyright (c) 2003 George Marsaglia
// References: http://www.jstatsoft.org/v08/i14/paper

// Xorshift(2^32-1)は Xorshift RNGs を用いた、シンプルな擬似乱数生成器です。
// copyright (c) 2009 Naoya Bellic
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
////////////////////////////////////////////////////////////////////////////////

integer x; // 種

integer xorshift_i() // 0でないinteger 型の値を返します。
{
  x = x ^ (x << 13);
  x = x ^ ((x >> 17) & 0x00007FFF); // 2009/01/08 修正
  return x = x ^ (x << 5);
}
float xorshift_f() // [0,1)のfloat 型の値を返します。
{
  x = x ^ (x << 13);
  x = x ^ ((x >> 17) & 0x00007FFF); // 2009/01/08 修正
  x = x ^ (x << 5);
  return (float)((x & 0x7fffffff) / 2147483648.0); // xを正にした後、2^31で割る
}

default
{
  state_entry()
  {
    x = llGetUnixTime(); // 初期化の種
  }
  touch_start(integer total_number)
  {
    // test
    integer RNG_i = xorshift_i();
    float RNG_f = xorshift_f();

    llSay(0, "integer:" + (string)RNG_i);
    llSay(0, "float:" + (string)RNG_f);
  }
}


上のほうのコメント行が見にくいのは気にしないでほしいっす・・・



2009/01/08
右シフト演算部分を修正
旧:x = x ^ ((x >> 17) ^ 0xFFFF8000);   


Posted by ぺんぎん at 00:13Comments(0)LSL-Con2008

2008年10月24日

無事に終了っす

昨日は夜遅くから始まったのにも関わらず、
大勢の方が参加してくださったっす。
ありがとうございましたっす。
どうもぺんぎんっす( ◎v◎ )


話に出てた、CからLSLへの翻訳っす。
今回、自分の場合は元のコードが短かったので苦には
ならなかったっすね。
staticが引っかかるくらいっすね。

他のめんどくさい事例は、
配列→気合い
switch分岐→気合い
break→努力
などなどっす

どうやら「気合い」と「努力」で結構イケるかもっす。
確かにMT(メルセンヌ・ツイスタ)に挑んだ時には
気合いが足りなかったっす。
どうやら修行が足りなかったみたいっす・・・
修行を積んで、再度挑んでみようと思うっす。  続きを読む
タグ :ぺんぎん


Posted by ぺんぎん at 21:30Comments(0)LSL-Con2008