<< 4/66 >>
First Last

Hack the Cell 課題

Mersenne Twister の高速化

結果はたくさん乱数を計算して、その合計値を正しく返す

  /* generates a random number on [0,0xffffffff]-interval */
  unsigned long genrand_int32(void)
  {
      unsigned long y;
      static unsigned long mag01[2]={0x0UL, MATRIX_A};
      /* mag01[x] = x * MATRIX_A  for x=0,1 */
  
      if (mti >= N) { /* generate N words at one time */
          int kk;
  
          if (mti == N+1)   /* if init_genrand() has not been called, */
              init_genrand(5489UL); /* a default initial seed is used */
  
          for (kk=0;kk<N-M;kk++) {
              y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
              mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
          }
          for (;kk<N-1;kk++) {
              y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
              mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
          }
          y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
          mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
  
          mti = 0;
      }
    
      y = mt[mti++];
  
      /* Tempering */
      y ^= (y >> 11);
      y ^= (y << 7) & 0x9d2c5680UL;
      y ^= (y << 15) & 0xefc60000UL;
      y ^= (y >> 18);
  
      return y;
  }