本日は
最近Macbook12インチの左シフトの反応が悪くなっているこの頃です.
困ったなー・・・. そう思いながらRustでXorshift(32ビット版だけ)
を実装です.
Rustは文法が難しいと感じたり,私をチュートリアルで挫折させたりしてくれますが,最近見るとRustbyExampleなどのページが出てきて少しやる気を出さしてくれる私にとってのツンデレ(?)言語です.英語ですが,紙媒体でRustの解説本がそろそろでる時期になってきましたので嬉しい限りです.
さて,今回の実装は
などをリファレンスとして記述しました.
実装例
main.rs
//Reference:
//https://stackoverflow.com/questions/37949215/how-do-i-move-mutable-state-into-a-closure
fn xorshift32() -> Box<FnMut() -> u32> {
let mut y = 2463534242 ;
Box::new(move || {
y = y ^ (y << 13);
y = y ^ (y >> 17);
y = y ^ (y << 5);
y
})
}
fn main() {
const N :i64 =100000000;
let mut xor32 = xorshift32();
let mut x: f32;
let mut y: f32;
let mut counter: i64 = 0;
for _ in 0..N{
x=((xor32() as i64) as f32)/std::u32::MAX as f32;
y=((xor32() as i64) as f32)/std::u32::MAX as f32;
if x*x+y*y < 1.0 {
counter+=1;
}
}
let pi = 4.0 * (counter as f32)/(N as f32);
println!("{:?}",pi );
}
うーん.変数 x
や y
の代入部分はキャストだらけ.
実行例(時間計測も含め)
バージョン確認
$ rustc --version
rustc 1.16.0 (30cf806ef 2017-03-10)
(2017/11/05 現在は最新バージョンが1.21なのでそろそろ上げておきたいところですね.)
コンパイル
$ rustc -C opt-level=3 main.rs
実行
$ time ./main.rs
3.1416576
real 0m0.653s
user 0m0.637s
sys 0m0.006s
思ってたよりも優秀です.
追記
ついでにRustバージョンをあげることにしました.
アップデート
$ rustup update
で Rust を 1.21.0 にアップデートしました.
$ rustc --version
rustc 1.21.0 (3b72af97e 2017-10-09)
コード修正
x=(xor32() as f32)/std::u32::MAX as f32;
でもコンパイル通りました.血迷っていたようです.
時間計測(1.21.0)
$ rustc -C opt-level=3 main.rs
$ time ./main
3.1416576
real 0m0.965s
user 0m0.933s
sys 0m0.010s
あうう・・・.少しスピードダウンしました.