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の場合)みたいに
&演算する数は簡単に書けるっす。
申し訳ないっす・・・
どうもぺんぎんっす( ◎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の場合)みたいに
&演算する数は簡単に書けるっす。
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);
コードリーディングのソースっす。
使用される際はコメント行も持って行ってくださいっす。
このコードは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);
2008年10月24日
無事に終了っす
昨日は夜遅くから始まったのにも関わらず、
大勢の方が参加してくださったっす。
ありがとうございましたっす。
どうもぺんぎんっす( ◎v◎ )
話に出てた、CからLSLへの翻訳っす。
今回、自分の場合は元のコードが短かったので苦には
ならなかったっすね。
staticが引っかかるくらいっすね。
他のめんどくさい事例は、
配列→気合い
switch分岐→気合い
break→努力
などなどっす
どうやら「気合い」と「努力」で結構イケるかもっす。
確かにMT(メルセンヌ・ツイスタ)に挑んだ時には
気合いが足りなかったっす。
どうやら修行が足りなかったみたいっす・・・
修行を積んで、再度挑んでみようと思うっす。 続きを読む
大勢の方が参加してくださったっす。
ありがとうございましたっす。
どうもぺんぎんっす( ◎v◎ )
話に出てた、CからLSLへの翻訳っす。
今回、自分の場合は元のコードが短かったので苦には
ならなかったっすね。
staticが引っかかるくらいっすね。
他のめんどくさい事例は、
配列→気合い
switch分岐→気合い
break→努力
などなどっす
どうやら「気合い」と「努力」で結構イケるかもっす。
確かにMT(メルセンヌ・ツイスタ)に挑んだ時には
気合いが足りなかったっす。
どうやら修行が足りなかったみたいっす・・・
修行を積んで、再度挑んでみようと思うっす。 続きを読む
タグ :ぺんぎん