LoginSignup
2
1

More than 5 years have passed since last update.

XorshiftのRustでの実装(32ビット版だけ)

Last updated at Posted at 2017-11-05

本日は

最近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 );
}

うーん.変数 xy の代入部分はキャストだらけ.

実行例(時間計測も含め)

バージョン確認

$ 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

あうう・・・.少しスピードダウンしました.

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1