2009年1月31日に64 bit Ubuntu を導入したので、 64 bit gcc での動作確認、性能評価、チューニングの作業をしました。

新しく開発しました(64 bit 非対応)

jump.c.html : Xorshift で戻ったり一瞬で相対ジャンプできるプログラム

浮動小数点数に特化した乱数ライブラリ(SSE2対応)

32ビット整数の生成は他のに比べ少し遅くなりますが、浮動小数点数の生成はかなり高速です。

元のメルセンヌ・ツイスタを使った乱数ライブラリ(SSE3対応)

マクロ HAVE_SSE3 を定義して Visual C++ 2008 でコンパイルすると、 SSE3 を使った高速なプログラムができます。

SFMT:新しいメルセンヌ・ツイスタを使った乱数ライブラリ

これには、C/C++(zsfmt)、C#、Java、Visual Basic、Delphi、GNU Pascal、
そして、エクセルのためのDLLが含まれます。
また、プログラムを自動作成するためのC言語ソースや、
それぞれに、結果の確認と実行時間計測するテストプログラムが含まれます。
独立した系列を32個持っています。

XorShiftを使った乱数ライブラリ

これにも、C/C++(zxor)、C#、Java、Visual Basic、Delphi、
そして、エクセルのためのDLLが含まれます。
それぞれに、結果の確認と実行時間計測するテストプログラムが含まれます。
関数名などはメルセンヌ・ツイスタと共通にしているため不自然になっています。
SSE2に対応していないCPUやコンパイラではSFMTよりも高速です。
基になったプログラムは以下のようにシンプルです。
http://www.jstatsoft.org/v08/i14/

unsigned long xor128(){
  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)) );
}

参考資料:メルセンヌ・ツイスタ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

参考文献:奥村晴彦 著「C言語による最新アルゴリズム事典」1991 技術評論社

zmtrand、zsfmt、zdsfmt 共通の特徴は以下です。

zsfmt の特徴は以下です。

その他の言語で書かれた Sfmt の特徴は以下です。

Sfmt で指定した MEXP に対する、乱数の周期の長さは以下の整数倍です。
zmtrand の周期は、4.31e6001 になります

MEXP保障された周期の長さ
607 5.31e182
1279 1.04e385
2281 4.46e686
4253 1.90e1280
11213 2.81e3375
19937 4.31e6001
444978.54e13394
862435.36e25961
1320495.12e39750
2160917.46e65049

以下に Windows XP で1億個乱数を生成するのにかかった秒数を示します。
mt19937ar.c と SFMT.c と dSFMT.c とそれらに必要なファイルは「参考資料」からダウンロードできます。
ただし、コンパイル可能なように少し修正する必要があります。

C/C++コンパイラ(Core 2 Quad Q9450) 32ビット整数の和
コンパイラ rand( ) mt19937ar.c zmtrand.c SFMT.c zsfmt.c xor128( ) zxor.c zdsfmt.c
Turbo C 1.5 2.700 27.400 1.600 ----- 1.100 16.500 1.600 1.600
Lsic-86 4.400 15.300 1.700 ----- 1.700 10.500 1.100 2.200
Cygwin gcc-4 1.125 0.547 0.343 0.328 0.250 0.265 0.406 0.328
Borland C++ 0.297 0.718 0.765 1.250 0.562 0.421 0.297 0.937
VC++6.0 0.296 0.625 0.625 1.109 0.375 0.390 0.203 0.609
VC++2002 0.641 0.593 0.313 0.391 0.171 0.297 0.203 0.234
VC++2003 0.641 0.609 0.312 0.391 0.171 0.297 0.203 0.234
VC++2005 1.750 0.578 0.312 0.171 0.171 0.297 0.203 0.234
VC++2008 1.719 0.578 0.312 0.171 0.171 0.297 0.265 0.234
linux 32bit 1.049 0.520 0.470 0.400 0.330 0.280 0.390 0.470
linux 64bit 1.049 0.590 0.540 0.690 0.530 0.280 0.400 0.470

C/C++コンパイラ(Core 2 Duo E6600) 32ビット整数の和
コンパイラ rand( ) mt19937ar.c zmtrand.c SFMT.c zsfmt.c xor128( ) zxor.c zdsfmt.c
Turbo C 1.5 3.300 31.300 1.600 ----- 1.600 18.600 2.100 1.700
Lsic-86 4.900 17.000 2.200 ----- 2.200 12.000 1.100 2.100
Cygwin gcc-4 1.125 0.609 0.375 0.359 0.281 0.296 0.469 0.390
Borland C++ 0.328 0.796 0.844 1.390 0.625 0.454 0.343 1.047
VC++6.0 0.343 0.703 0.687 1.234 0.421 0.406 0.234 0.687
VC++2002 0.718 0.671 0.359 0.453 0.203 0.343 0.234 0.281
VC++2003 0.718 0.671 0.359 0.453 0.203 0.343 0.234 0.281
VC++2005 1.968 0.640 0.344 0.203 0.187 0.343 0.234 0.281
VC++2008 1.921 0.656 0.343 0.188 0.203 0.343 0.296 0.281
linux 32bit 1.049 0.580 0.520 0.450 0.370 0.320 0.430 0.540
linux 64bit 1.049 0.660 0.600 0.770 0.600 0.310 0.440 0.540

C/C++コンパイラ(Celeron D 2.66 GHz) 32ビット整数の和
コンパイラ rand( ) mt19937ar.c zmtrand.c SFMT.c zsfmt.c xor128( ) zxor.c zdsfmt.c
Turbo C 1.5 10.400 79.600 3.800 ----- 2.700 50.500 3.200 3.200
Lsic-86 6.600 17.500 3.800 ----- 4.900 11.000 2.700 4.400
Cygwin gcc-4 2.282 0.828 0.640 0.734 0.484 0.297 0.453 0.734
Borland C++ 0.656 1.562 1.125 1.719 0.687 0.719 0.468 1.094
VC++6.0 0.625 1.156 0.906 1.734 0.593 0.609 0.250 0.984
VC++2002 0.718 1.265 0.687 0.656 0.484 0.328 0.250 0.531
VC++2003 0.719 1.265 0.703 0.656 0.437 0.328 0.250 0.531
VC++2005 4.343 1.219 0.547 0.359 0.344 0.359 0.234 0.468
VC++2008 4.343 1.219 0.500 0.343 0.344 0.359 0.281 0.484
linux 32bit 1.049 0.810 0.620 0.730 0.470 0.410 0.460 0.740
linux 64bit 1.049 1.049 0.710 1.049 1.049 0.260 0.460 0.660

C/C++コンパイラ(Atom N270) 32ビット整数の和
コンパイラ rand( ) mt19937ar.c zmtrand.c SFMT.c zsfmt.c xor128( ) zxor.c zdsfmt.c
Turbo C 1.5 26.900152.100 39.500 ----- 19.700108.200 46.100 66.400
Lsic-86 39.500102.200 32.400 ----- 30.200 72.000 38.400 28.000
Cygwin gcc-4 5.172 2.234 1.109 1.282 0.859 0.765 1.125 1.015
Borland C++ 0.890 2.984 2.515 3.719 1.703 1.390 1.265 2.921
VC++6.0 0.875 2.406 2.329 3.750 1.515 1.078 0.625 2.390
VC++2002 1.328 2.500 1.093 0.859 0.594 0.750 0.625 0.796
VC++2003 1.343 2.515 1.093 0.859 0.593 0.781 0.625 0.796
VC++2005 8.937 2.359 0.985 0.562 0.718 0.625 0.625 0.828
VC++2008 6.407 2.359 0.968 0.593 0.718 0.625 0.625 0.843

C/C++コンパイラ(Core 2 Quad Q9450) 53/52ビット精度浮動小数点の和
コンパイラ mt19937ar.c zmtrand.c SFMT.c zsfmt.c zxor.c dSFMT.c zdsfmt.c
Turbo C 1.5 60.000 11.000 ----- 5.000 10.400 ----- 1.600
Lsic-86 66.000 39.000 ----- 39.000 38.000 ----- 22.000
Cygwin gcc-4 2.650 2.340 1.720 2.500 2.250 0.234 0.406
Borland C++ 3.120 3.120 3.750 2.650 4.141 2.062 1.000
VC++6.0 3.280 2.960 ----- 2.180 1.797 1.235 0.828
VC++2002 1.410 0.940 2.030 1.250 1.359 1.250 0.234
VC++2003 1.560 1.090 2.030 1.250 1.359 0.453 0.234
VC++2005 1.400 0.930 1.720 1.250 1.359 0.234 0.343
VC++2008 1.400 0.940 1.720 1.250 1.296 0.234 0.343
linux 32bit 2.500 2.400 1.900 2.500 1.049 0.260 0.430
linux 64bit 1.300 1.100 1.600 1.300 0.720 0.400 0.430

C/C++コンパイラ(Core 2 Duo E6600) 53/52ビット精度浮動小数点の和
コンパイラ mt19937ar.c zmtrand.c SFMT.c zsfmt.c zxor.c dSFMT.c zdsfmt.c
Turbo C 1.5 71.000 16.000 ----- 11.000 11.500 ----- 2.200
Lsic-86 76.000 43.000 ----- 44.000 44.000 ----- 22.000
Cygwin gcc-4 2.810 2.650 2.030 2.810 2.500 0.281 0.468
Borland C++ 3.440 3.430 4.070 2.970 4.609 2.297 1.109
VC++6.0 3.750 3.280 ----- 2.500 2.000 1.390 0.922
VC++2002 1.710 1.090 2.340 1.400 1.515 1.421 0.281
VC++2003 1.720 1.100 2.340 1.400 1.515 0.531 0.281
VC++2005 1.560 1.090 2.030 1.400 1.515 0.281 0.406
VC++2008 1.560 1.090 2.030 1.400 1.453 0.281 0.406
linux 32bit 2.800 2.700 2.100 3.000 1.049 0.350 0.490
linux 64bit 1.400 1.200 1.800 1.400 0.800 0.510 0.490

C/C++コンパイラ(Celeron D 2.66 GHz) 53/52ビット精度浮動小数点の和
コンパイラ mt19937ar.c zmtrand.c SFMT.c zsfmt.c zxor.c dSFMT.c zdsfmt.c
Turbo C 1.5 192.000 38.000 ----- 27.000 25.800 ----- 3.200
Lsic-86 214.000192.000 -----181.000186.000 -----154.000
Cygwin gcc-4 6.870 7.190 5.150 7.340 6.000 0.625 0.672
Borland C++ 8.280 9.210 6.720 7.030 8.515 4.953 1.844
VC++6.0 10.780 7.500 ----- 6.720 5.953 2.984 1.781
VC++2002 2.960 2.180 7.030 2.500 2.265 4.593 0.547
VC++2003 2.960 2.340 7.030 2.340 2.265 1.343 0.547
VC++2005 2.810 2.030 6.400 2.340 2.266 0.609 0.562
VC++2008 2.810 2.030 6.250 2.340 2.234 0.656 0.547
linux 32bit 7.100 7.300 5.100 7.400 1.049 0.890 0.770
linux 64bit 2.900 2.300 7.100 7.400 1.049 0.890 0.680

C/C++コンパイラ(Atom N270) 53/52ビット精度浮動小数点の和
コンパイラ mt19937ar.c zmtrand.c SFMT.c zsfmt.c zxor.c dSFMT.c zdsfmt.c
Turbo C 1.5 357.000131.000 ----- 71.000131.300 ----- 65.900
Lsic-86 489.000444.000 -----330.000456.000 -----176.000
Cygwin gcc-4 6.250 5.150 5.000 6.090 4.515 1.094 1.312
Borland C++ 9.530 8.120 9.370 6.250 6.500 5.984 3.579
VC++6.0 8.900 6.880 ----- 4.840 3.468 4.234 2.875
VC++2002 7.340 4.840 4.060 4.530 4.750 3.922 0.984
VC++2003 7.500 4.850 4.060 4.530 4.750 1.375 0.984
VC++2005 7.180 4.850 3.430 4.680 4.812 1.406 1.078
VC++2008 7.180 5.000 3.430 4.840 4.859 1.406 1.078

C/C++コンパイラ(Core 2 Quad Q9450) NextMt/NextBitの速度
コンパイラ zmtrand.c zsfmt.c zxor.c zdsfmt.c
Turbo C 1.5 1.600/ 0.540 1.100/ 0.550 1.600/ 0.550 1.600/ 0.540
Lsic-86 1.700/ 0.760 1.700/ 0.600 1.100/ 0.600 2.200/ 0.660
Cygwin gcc-4 0.343/ 0.218 0.250/ 0.218 0.406/ 0.234 0.328/ 0.266
Borland C++ 0.765/ 0.343 0.562/ 0.328 0.297/ 0.344 0.937/ 0.343
VC++6.0 0.625/ 0.218 0.375/ 0.187 0.203/ 0.218 0.609/ 0.203
VC++2002 0.313/ 0.187 0.171/ 0.234 0.203/ 0.218 0.234/ 0.187
VC++2003 0.312/ 0.187 0.171/ 0.156 0.203/ 0.203 0.234/ 0.187
VC++2005 0.312/ 0.187 0.171/ 0.219 0.203/ 0.218 0.234/ 0.219
VC++2008 0.312/ 0.219 0.171/ 0.219 0.265/ 0.219 0.234/ 0.156
linux 32bit 0.470/ 0.230 0.330/ 0.220 0.390/ 0.230 0.470/ 0.230
linux 64bit 0.540/ 0.230 0.530/ 0.240 0.400/ 0.230 0.470/ 0.220

C/C++コンパイラ(Core 2 Duo E6600) NextMt/NextBitの速度
コンパイラ zmtrand.c zsfmt.c zxor.c zdsfmt.c
Turbo C 1.5 1.600/ 0.600 1.600/ 0.600 2.100/ 0.600 1.700/ 0.600
Lsic-86 2.200/ 0.870 2.200/ 0.660 1.100/ 0.660 2.100/ 0.710
Cygwin gcc-4 0.375/ 0.234 0.281/ 0.234 0.469/ 0.250 0.390/ 0.296
Borland C++ 0.844/ 0.375 0.625/ 0.375 0.343/ 0.390 1.047/ 0.390
VC++6.0 0.687/ 0.234 0.421/ 0.219 0.234/ 0.250 0.687/ 0.218
VC++2002 0.359/ 0.218 0.203/ 0.250 0.234/ 0.234 0.281/ 0.218
VC++2003 0.359/ 0.218 0.203/ 0.171 0.234/ 0.234 0.281/ 0.218
VC++2005 0.344/ 0.218 0.187/ 0.250 0.234/ 0.250 0.281/ 0.250
VC++2008 0.343/ 0.234 0.203/ 0.250 0.296/ 0.250 0.281/ 0.172
linux 32bit 0.520/ 0.250 0.370/ 0.250 0.430/ 0.260 0.540/ 0.260
linux 64bit 0.600/ 0.250 0.600/ 0.270 0.440/ 0.260 0.540/ 0.240

C/C++コンパイラ(Celeron D 2.66 GHz) NextMt/NextBitの速度
コンパイラ zmtrand.c zsfmt.c zxor.c zdsfmt.c
Turbo C 1.5 3.800/ 1.640 2.700/ 1.640 3.200/ 1.640 3.200/ 1.640
Lsic-86 3.800/ 1.640 4.900/ 1.700 2.700/ 1.590 4.400/ 1.700
Cygwin gcc-4 0.640/ 0.281 0.484/ 0.281 0.453/ 0.281 0.734/ 0.421
Borland C++ 1.125/ 0.656 0.687/ 0.656 0.468/ 0.640 1.094/ 0.656
VC++6.0 0.906/ 0.390 0.593/ 0.375 0.250/ 0.343 0.984/ 0.391
VC++2002 0.687/ 0.375 0.484/ 0.297 0.250/ 0.281 0.531/ 0.375
VC++2003 0.703/ 0.375 0.437/ 0.296 0.250/ 0.281 0.531/ 0.375
VC++2005 0.547/ 0.328 0.344/ 0.313 0.234/ 0.266 0.468/ 0.328
VC++2008 0.500/ 0.359 0.344/ 0.359 0.281/ 0.265 0.484/ 0.359
linux 32bit 0.620/ 0.290 0.470/ 0.290 0.460/ 0.280 0.740/ 0.430
linux 64bit 0.710/ 0.290 1.049/ 0.350 0.460/ 0.280 0.660/ 0.290

C/C++コンパイラ(Atom N270) NextMt/NextBitの速度
コンパイラ zmtrand.c zsfmt.c zxor.c zdsfmt.c
Turbo C 1.5 39.500/ 12.520 19.700/ 5.650 46.100/ 12.740 66.400/ 13.340
Lsic-86 32.400/ 11.470 30.200/ 5.490 38.400/ 11.700 28.000/ 5.430
Cygwin gcc-4 1.109/ 0.515 0.859/ 0.547 1.125/ 0.547 1.015/ 0.609
Borland C++ 2.515/ 0.594 1.703/ 0.578 1.265/ 1.062 2.921/ 0.625
VC++6.0 2.329/ 0.593 1.515/ 0.578 0.625/ 0.609 2.390/ 0.609
VC++2002 1.093/ 0.563 0.594/ 0.547 0.625/ 0.531 0.796/ 0.562
VC++2003 1.093/ 0.562 0.593/ 0.547 0.625/ 0.531 0.796/ 0.562
VC++2005 0.985/ 0.562 0.718/ 0.546 0.625/ 0.421 0.828/ 0.562
VC++2008 0.968/ 0.562 0.718/ 0.609 0.625/ 0.406 0.843/ 0.563

エクセルVBAとDLL(Core 2 Duo E6600)
コンパイラ libZMT0.dlllibSFMT.dlllibXor.dll
Borland C++ 2.328 3.388 2.280
MS VS 6.0 2.264 3.328 2.108
MS VS 2002 2.200 2.140 1.952
MS VS 2003 2.200 2.092 1.936
MS VS 2005 2.156 2.044 2.220
VC++ 2008 Ex 2.204 2.093 2.000

その他の言語(Core 2 Duo E6600)
コンパイラ Random.Next Rnd Sfmtxor128( )XorShift
Visual Basic 1.218 4.9060.984 0.546 0.453
C# 1.234 -----0.938 0.453 0.407
Java ----- -----1.562 0.703 0.781
Delphi ----- -----0.735 0.639 0.500

主な関数の用途

InitMt(S)       整数の種Sによる初期化
InitMtEx(K,L)   長さLの配列Kによる初期化
NextMt()        32ビット符号なし整数の乱数
NextUnif()      0以上1未満の乱数(53bit精度)
NextInt(N)      0以上N未満の整数乱数
NextIntEx(N)    丸め誤差のない0以上N未満の整数乱数

NextBit()              0か1を返す(NextInt(2)の最高10倍高速)
NextByte()             0から255の値を返す
NextChisq(N)           自由度νのカイ2乗分布       p. 27
NextGamma(A)           パラメータAのガンマ分布     p. 31
NextGeometric(P)       確率Pの幾何分布             p. 34
NextTriangle()         三角分布                     p. 89
NextExp()              平均1の指数分布             p.106
NextNormal()           標準正規分布(最大8.57σ)     p.133
NextUnitVect(V,N)      N次元のランダム単位ベクトル p.185
NextBinomial(N,P)      パラメータN,Pの2項分布    p.203
NextBinormal(R,&X,&Y)  相関係数Rの2変量正規分布   p.211
NextBeta(A,B)          パラメータA,Bのベータ分布  p.257
NextPower(N)           パラメータNの累乗分布       p.305
NextLogistic()         ロジスティック分布           p.313
NextCauchy()           コーシー分布                 p.331
NextFDist(A,B)         自由度A,BのF分布          p.344
NextPoisson(L)         平均λのポアソン分布         p.412
NextTDist(N)           自由度Nのt分布             p.430
NextWeibull(A)         パラメータαのワイブル分布   p.431

ほかの関数や、より詳細な使い方は、それぞれの言語のテストプログラムを読んでください。
一部の関数ではパラメータの受け取り方が言語により異なります。