先日、twitterでのやりとりを介してxorshift乱数発生アルゴリズムのことを知りました。非常に簡単な処理(xorとshiftだけ)で周期の長い擬似乱数を生成できるアルゴリズムです。詳しくはwikipediaのxorshiftで。
例になっているのは全て1ワードが32bitのものでした。8bitマイコンとかでも使いやすいように1ワードが8bitのバージョンを作れないかと思って試してみました。
乱数検定はしていませんが、周期だけは確認しています。
(1) 周期が255 (= 2^8 - 1)
アルゴリズム
uint8_t x;
x ^= x >> A;
x ^= x << B;
x ^= x >> C;
return x;
シードはxの初期値です。AとBとCは定数で、全探索してみたところ24組が周期255になることが分かりました。
1 : 1 1 2 (A B Cの順)
2 : 1 1 3
3 : 1 7 3
4 : 1 7 6
5 : 1 7 7
6 : 2 1 1
7 : 2 5 5
8 : 3 1 1
9 : 3 1 5
10 : 3 5 4
11 : 3 5 5
12 : 3 5 7
13 : 3 7 1
14 : 4 5 3
15 : 5 1 3
16 : 5 3 6
17 : 5 3 7
18 : 5 5 2
19 : 5 5 3
20 : 6 3 5
21 : 6 7 1
22 : 7 3 5
23 : 7 5 3
24 : 7 7 1
(2) 周期が16777215 (= 2^24 - 1)
アルゴリズム
uint8_t x, y, z, t;
t = x ^ x << a;
x = y;
y = z;
z ^= z >> c ^ t ^ t >> b;
return z;
シードはx, y, zの初期値です。周期が16777215になるのは1通りでした。
1 : 1 5 3 (A B Cの順)
(3) 周期が2147483647 (= 2^31 - 1)
アルゴリズム
t = x ^ x << a;
x = y;
y = z;
z = w;
w ^= w >> c ^ t ^ t >> b;
return w;
次は周期が2^32 - 1と思って探したのですが、見つかりませんでした。そのかわり、約半分の2^31 - 1のものが見つかりました。今までの例は0以外の全ての値を取るので、シードとしてどの値から始めても同じ周期になりますが、今回のはちょうど半分しか回っていないので、初期値によっては周期が2^31-1にならない可能性があるのではないかと思います。その意味でも周期が2^32 - 1のものが見つからなかったのは残念です。
周期が2147483647となるA B Cの組は13通りありました。
1 : 1 1 6
2 : 1 1 7
3 : 1 2 7
4 : 1 4 7
5 : 1 6 7
6 : 3 1 6
7 : 3 2 1
8 : 3 5 1
9 : 4 3 1
10 : 5 1 5
11 : 6 1 3
12 : 6 5 2
13 : 7 2 1
おわりに
乱数検定とかしてないので、どのくらい良い乱数かは分かりませんが、周期だけは長いです。
参考文献
G. Marsaglia, “Xorshift RNGs,”Journal of Statistical Software, 8(14), July 2003.
(http://www.jstatsoft.org/v08/i14/paper)
例になっているのは全て1ワードが32bitのものでした。8bitマイコンとかでも使いやすいように1ワードが8bitのバージョンを作れないかと思って試してみました。
乱数検定はしていませんが、周期だけは確認しています。
(1) 周期が255 (= 2^8 - 1)
アルゴリズム
uint8_t x;
x ^= x >> A;
x ^= x << B;
x ^= x >> C;
return x;
シードはxの初期値です。AとBとCは定数で、全探索してみたところ24組が周期255になることが分かりました。
1 : 1 1 2 (A B Cの順)
2 : 1 1 3
3 : 1 7 3
4 : 1 7 6
5 : 1 7 7
6 : 2 1 1
7 : 2 5 5
8 : 3 1 1
9 : 3 1 5
10 : 3 5 4
11 : 3 5 5
12 : 3 5 7
13 : 3 7 1
14 : 4 5 3
15 : 5 1 3
16 : 5 3 6
17 : 5 3 7
18 : 5 5 2
19 : 5 5 3
20 : 6 3 5
21 : 6 7 1
22 : 7 3 5
23 : 7 5 3
24 : 7 7 1
(2) 周期が16777215 (= 2^24 - 1)
アルゴリズム
uint8_t x, y, z, t;
t = x ^ x << a;
x = y;
y = z;
z ^= z >> c ^ t ^ t >> b;
return z;
シードはx, y, zの初期値です。周期が16777215になるのは1通りでした。
1 : 1 5 3 (A B Cの順)
(3) 周期が2147483647 (= 2^31 - 1)
アルゴリズム
t = x ^ x << a;
x = y;
y = z;
z = w;
w ^= w >> c ^ t ^ t >> b;
return w;
次は周期が2^32 - 1と思って探したのですが、見つかりませんでした。そのかわり、約半分の2^31 - 1のものが見つかりました。今までの例は0以外の全ての値を取るので、シードとしてどの値から始めても同じ周期になりますが、今回のはちょうど半分しか回っていないので、初期値によっては周期が2^31-1にならない可能性があるのではないかと思います。その意味でも周期が2^32 - 1のものが見つからなかったのは残念です。
周期が2147483647となるA B Cの組は13通りありました。
1 : 1 1 6
2 : 1 1 7
3 : 1 2 7
4 : 1 4 7
5 : 1 6 7
6 : 3 1 6
7 : 3 2 1
8 : 3 5 1
9 : 4 3 1
10 : 5 1 5
11 : 6 1 3
12 : 6 5 2
13 : 7 2 1
おわりに
乱数検定とかしてないので、どのくらい良い乱数かは分かりませんが、周期だけは長いです。
参考文献
G. Marsaglia, “Xorshift RNGs,”Journal of Statistical Software, 8(14), July 2003.
(http://www.jstatsoft.org/v08/i14/paper)
最新の画像[もっと見る]
-
Nucleo F411REでMicroPythonを動かしてみた 2年前
-
Nucleo F411REでMicroPythonを動かしてみた 2年前
-
Nucleo F411REでMicroPythonを動かしてみた 2年前
-
Nucleo F411REでMicroPythonを動かしてみた 2年前
-
Nucleo F411REでMicroPythonを動かしてみた 2年前
-
Nucleo F411REでMicroPythonを動かしてみた 2年前
-
aitendo福袋 2015 LCD版 5年前
-
Maker Faire Tokyo 2013に遊びに行ってきました その6 6年前
-
Maker Faire Tokyo 2013に遊びに行ってきました その6 6年前
-
Maker Faire Tokyo 2013に遊びに行ってきました その6 6年前
「その他」カテゴリの最新記事
Maker Faire Tokyo 2014に行ってきました(3)
Maker Faire Tokyo 2014に行ってきました(2)
Maker Faire Tokyo 2014に行ってきました(1)
Maker Faire Tokyo 2013に遊びに行ってきました その6
Maker Faire Tokyo 2013に遊びに行ってきました その5
Maker Faire Tokyo 2013に遊びに行ってきました その4
Maker Faire Tokyo 2013に遊びに行ってきました その3
Maker Faire Tokyo 2013に遊びに行ってきました その2
Maker Faire Tokyo 2013に遊びに行ってきました その1
8bit用xorshift乱数発生アルゴリズム
http://marsee101.blog19.fc2.com/blog-entry-2448.html
http://marsee101.blog19.fc2.com/blog-entry-2449.html
http://marsee101.blog19.fc2.com/blog-entry-2450.html
試されたことがあったんですね。
検定は悩ましいところです。
周期は本来ならBerlekamp-Masseyアルゴリズムを使うべきなんでしょうが、手を抜いて元の値になるまでぐるぐる回しています。
こんなに簡単な方法で乱数生成できるのは驚きました。
Xorshift pseudorandom number generator | Arklyffe.com
http://www.arklyffe.com/main/2010/08/29/xorshift-pseudorandom-number-generator/
mft2013で赤外線でつながる協調ユニットを展示されていた方ですよね。ていねいな説明ありがとうございました。
8bit xorshiftのパラメータ探索されてる方がおられたんですね。記事をありがとうございます。
余談:乱数の件。クリスマスの電飾パタンに利用しようとしたのですが,ランダムなのは意外と面白くないものですね。かといってパタンに嵌めると飽きてきます。この辺の按配が難しいところです。
xorshiftの A B C はそのような方法で決めないとならないのでしょうか?
今、64Bitのxorshiftが欲しいと思って検索しているのですが、
ビットシフトの部分にどの数値を適用していいのかさっぱり分からなくて困ってます。
これって全部実験して決めるようなたぐいの物なのでしょうか?
xorshiftの A B C はそのような方法で決めないとならないのでしょうか?
今、64Bitのxorshiftが欲しいと思って検索しているのですが、
ビットシフトの部分にどの数値を適用していいのかさっぱり分からなくて困ってます。
これって全部実験して決めるようなたぐいの物なのでしょうか?