Twitterに投稿 はてなブックマークに追加 Google Bookmarksに追加

目次 >> C、C++ >> Tips

XORSHIFTによる乱数

XORSHIFTアルゴリズムによる乱数は、非常にシンプルなコードでメルセンヌ・ツイスターに近い良質な乱数を生成する。

#include <iostream>
#include <cmath>
using namespace std;

unsigned long xor128(void)
{
    static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;
    unsigned long t;
    t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) );
}

int main(void)
{
    unsigned long sum=0;
    for (int j=0;j<1000;j++)
    {
        for (int i=0;i<100000;i++)
        {
            sum+=xor128()%2;
        }
        double ave=double(sum)/(j*100000);
        cout<<ave<<endl;
    }
    return 0;
}

上記関数xor128()で得られる数値の範囲は、0からULONG_MAXの間の値である。0から1までの乱数を得るには、得た数値/(float)(ULONG_MAX)とするとよい。


最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて20.04、21.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2021 Chikuma Engineering Co., Ltd. All Rights Reserved.