メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcMTRand64.c

64bit version [詳細]

#include "dkcMTRand64.h"
#include <dkutil_c/dkc_misc.h>

dkcMTRand64.cのインクルード依存関係図

ソースコードを見る。

マクロ定義

#define DKUTIL_C_MT_RAND64_C
#define NN   dkcdMT_RAND64_NN
#define MM   156
#define MATRIX_A   dkcmUINT64DEFINE(0xB5026F5AA96619E9)
#define UM   dkcmUINT64DEFINE(0xFFFFFFFF80000000)
#define LM   dkcmUINT64DEFINE(0x7FFFFFFF)

関数

DKC_MT_RAND64 *WINAPI dkcAllocMTRand64 (uint64 seed)
int WINAPI dkcFreeMTRand64 (DKC_MT_RAND64 **p)
void WINAPI dkcMTRand64Init (DKC_MT_RAND64 *p, uint64 seed)
void WINAPI dkcMTRand64InitByArray (DKC_MT_RAND64 *p, uint64 *init_key, uint64 key_length)
DKC_INLINE void dkcMTRand64Next_C (DKC_MT_RAND64 *p)
uint64 WINAPI dkcMTRand64Get (DKC_MT_RAND64 *p)
 generates a random number on [0, 2^64-1]-interval


説明

64bit version

作者:
reconstruct by d金魚
から:
2006/01/18
覚え書き:
This is the original introductory comment: -----------------------------------------
A C-program for MT19937-64 (2004/9/29 version). Coded by Takuji Nishimura and Makoto Matsumoto.

This is a 64-bit version of Mersenne Twister pseudorandom number generator.

Before using, initialize the state by using init_genrand64(seed) or init_by_array64(init_key, key_length).

Copyright (C) 2004, Makoto Matsumoto and Takuji Nishimura, All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

References: T. Nishimura, ``Tables of 64-bit Mersenne Twisters'' ACM Transactions on Modeling and Computer Simulation 10. (2000) 348--357. M. Matsumoto and T. Nishimura, ``Mersenne Twister: a 623-dimensionally equidistributed uniform pseudorandom number generator'' ACM Transactions on Modeling and Computer Simulation 8. (Jan. 1998) 3--30.

Any feedback is very welcome. http://www.math.hiroshima-u.ac.jp/~m-mat/MT/emt.html email: m-mat @ math.sci.hiroshima-u.ac.jp (remove spaces)

dkcMTRand64.c で定義されています。


マクロ定義

#define DKUTIL_C_MT_RAND64_C
 

dkcMTRand64.c70 行で定義されています。

#define LM   dkcmUINT64DEFINE(0x7FFFFFFF)
 

dkcMTRand64.c74 行で定義されています。

#define MATRIX_A   dkcmUINT64DEFINE(0xB5026F5AA96619E9)
 

dkcMTRand64.c72 行で定義されています。

#define MM   156
 

dkcMTRand64.c71 行で定義されています。

#define NN   dkcdMT_RAND64_NN
 

dkcMTRand64.c70 行で定義されています。

#define UM   dkcmUINT64DEFINE(0xFFFFFFFF80000000)
 

dkcMTRand64.c73 行で定義されています。


関数

DKC_MT_RAND64* WINAPI dkcAllocMTRand64 uint64  seed  ) 
 

dkcMTRand64.c76 行で定義されています。

参照先 dkcMTRand64Next_C(), dkcMTRand64SetNextFunction(), dkc_Mersenne_Twister_64bit::mallocPtr, と uint32.

00081 {
00082     const uint32 alignMask = 15;    /* = 2^n - 1 */
00083     char *tp = dkcAllocateFast_INL(sizeof(DKC_MT_RAND64) + alignMask);
00084     DKC_MT_RAND64 *p;
00085     if(NULL==tp) return NULL;
00086     //mymt.cより16byte align technic for SSE
00087     p = (DKC_MT_RAND64 *)(((int)tp + alignMask) & ~alignMask);
00088     p->mallocPtr = tp;

int WINAPI dkcFreeMTRand64 DKC_MT_RAND64 **  p  ) 
 

dkcMTRand64.c90 行で定義されています。

00095 {

uint64 WINAPI dkcMTRand64Get DKC_MT_RAND64 p  ) 
 

generates a random number on [0, 2^64-1]-interval

dkcMTRand64.c174 行で定義されています。

参照元 dkcMTRand64_Get63(), dkcMTRand64_real1(), dkcMTRand64_real2(), と dkcMTRand64_real3().

00179 {

void WINAPI dkcMTRand64Init DKC_MT_RAND64 p,
uint64  seed
 

警告:
必ずdkcAllocMTRand64()で確保した領域を初期化してください。

dkcMTRand64.c96 行で定義されています。

00100                                                          {
00101     int mti = p->index;
00102     uint64 *mt = p->state;
00103     p->state[0] = seed;
00104   for (mti=1; mti<NN; mti++)
00105     {

void WINAPI dkcMTRand64InitByArray DKC_MT_RAND64 p,
uint64 *  init_key,
uint64  key_length
 

警告:
必ずdkcAllocMTRand64()で確保した領域を初期化してください。

dkcMTRand64.c107 行で定義されています。

00112 {
00113     uint64 i, j, k;
00114         uint64 *mt = p->state;
00115     dkcMTRand64Init(p,dkcmUINT64DEFINE(19650218));
00116     i=1; j=0;
00117     k = (NN>key_length ? NN : key_length);
00118     for (; k; k--) {
00119         mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * dkcmUINT64DEFINE(3935559000370003845)))
00120           + init_key[j] + j; /* non linear */
00121         i++; j++;
00122         if (i>=NN) { mt[0] = mt[NN-1]; i=1; }
00123         if (j>=key_length) j=0;
00124     }
00125     for (k=NN-1; k; k--) {
00126         mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * dkcmUINT64DEFINE(2862933555777941757)))
00127           - i; /* non linear */
00128         i++;
00129         if (i>=NN) { mt[0] = mt[NN-1]; i=1; }

DKC_INLINE void dkcMTRand64Next_C DKC_MT_RAND64 p  ) 
 

dkcMTRand64.c131 行で定義されています。

参照元 dkcAllocMTRand64().

00135                                                    {
00136     int i;
00137     int mti = p->index;
00138     uint64 *mt = p->state;
00139     uint64 x;
00140     /* if init_genrand64() has not been called, */
00141     /* a default initial seed is used     */
00142     /*if (mti == NN+1) 
00143             dkcMTRand64Init(p,dkcmUINT64DEFINE(5489)); 
00144     */
00145 
00146     static uint64 mag01[2]={dkcmUINT64DEFINE(0), MATRIX_A};
00147     for (i=0;i<NN-MM;i++) {
00148             x = (mt[i]&UM)|(mt[i+1]&LM);
00149             mt[i] = mt[i+MM] ^ (x>>1) ^ mag01[(int)(x&dkcmUINT64DEFINE(1))];
00150     }
00151     for (;i<NN-1;i++) {
00152             x = (mt[i]&UM)|(mt[i+1]&LM);
00153             mt[i] = mt[i+(MM-NN)] ^ (x>>1) ^ mag01[(int)(x&dkcmUINT64DEFINE(1))];
00154     }
00155     x = (mt[NN-1]&UM)|(mt[0]&LM);
00156     mt[NN-1] = mt[MM-1] ^ (x>>1) ^ mag01[(int)(x&dkcmUINT64DEFINE(1))];
00157 
00158     mti = 0;
00159 
00160         //update
00161     {
00162         uint64 *cache = p->output;
00163         for (i = 0; i < NN; i++) {
00164             register uint64 x;
00165             x = mt[i];
00166             /* Tempering */
00167             x ^= (x >> 29) & dkcmUINT64DEFINE(0x5555555555555555);
00168             x ^= (x << 17) & dkcmUINT64DEFINE(0x71D67FFFEDA60000);
00169             x ^= (x << 37) & dkcmUINT64DEFINE(0xFFF7EEE000000000);
00170             x ^= (x >> 43);
00171             cache[i] = x;


dKingyoMersenneTwisterLibraryに対してThu Jan 19 05:10:25 2006に生成されました。  doxygen 1.4.4