HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0707
koutaxorshift32を再現したが0に収束する3解決


kouta

リンク

2019/7/7(Sun) 11:04:47|NO.87826

タイトルの通りです。独学で調べて優良パラメータにしているはずなのですがどういうわけかすぐに0に収束してしまいます。
間違っている部分がわからないので教えてほしいです。

#include "hspmath.as" shift=0 ;シフト回数 seed=654514674 seed_1=0 *main shift=13 gosub *leftshift mes seed shift=17 gosub *rightshift mes seed shift=15 gosub *leftshift mes seed wait 1 goto *main *leftshift seed_1=seed<<shift ;左に算術シフト a=(seed>>(32-shift))&(%01111111111111111111111111111111>>(32-shift-1)) ;はみ出たビットを抽出して右に寄せる seed_1=seed_1^a ;算術シフト結果とはみ出たビットを合成 seed=seed^seed_1 ;xorで合成 return *rightshift seed_1=seed>>shift ;右に算術シフト(符号のコピーが発生) seed_1=seed_1&(%01111111111111111111111111111111>>(shift-1)) ;余分な符号のコピーを消去 seed_1=seed_1^(seed<<(32-shift)) ;はみ出したビットを補完 seed=seed^seed_1 ;xorで合成 return



この記事に返信する


kouta

リンク

2019/7/7(Sun) 11:14:47|NO.87827

書き忘れたのですがこのままだと収束するのが画面外になるのでscreenとかでウィンドウの高さを広げてください。



沢渡

リンク

2019/7/7(Sun) 13:24:42|NO.87828

私の調べた限り、xorshiftははみ出したビットが捨てられることも考慮に入れた上で
設計されているようなので、はみ出したビットの補完は不要なのではないでしょうか。
参考:https://ja.wikipedia.org/wiki/Xorshift
http://d.hatena.ne.jp/tsukaban/20130727/p1

shift=0 ;シフト回数 seed=654514674 seed_1=0 repeat 200 shift=13 gosub *leftshift shift=17 gosub *rightshift shift=5 gosub *leftshift if cnt>=190 : mes seed //最後の10個のみ表示 loop stop *leftshift seed_1=seed<<shift ;左に算術シフト(論理シフトと同じ) seed=seed^seed_1 ;xorで合成 return *rightshift seed_1=seed>>shift ;右に算術シフト(符号のコピーが発生) seed_1=seed_1&(%01111111111111111111111111111111>>(shift-1)) ;余分な符号のコピーを消去 seed=seed^seed_1 ;xorで合成 return



kouta

リンク

2019/7/7(Sun) 14:27:15|NO.87829

沢渡さんの言う通りでした!無事完成しました!
沢渡さんありがとうございます!



ONION software Copyright 1997-2021(c) All rights reserved.