-
.h文件
#import <Foundation/Foundation.h>
@interface MersenneTwister : NSObject
- (id)initWithSeed:(int32_t) seed;
- (int32_t)nextInt;
- (double)nextDouble;
- (void)twist;
@end
-
.m文件
#import "MersenneTwister.h"
#define N 624
#define M 397
#define MATRIX_A 0x9908b0df
#define UPPER_MASK 0x80000000
#define LOWER_MASK 0x7fffffff
#define TEMPERING_MASK_B -1658038656
#define TEMPERING_MASK_C -272236544
@interface MersenneTwister()
{
int32_t mti;
int32_t mt[N];
}
@end
@implementation MersenneTwister
- (id)initWithSeed:(int32_t)seed{
mti = 0;
for(int i=0;i<N;i++){
mt[i] = 0;
}
mt[0] = seed;
for(mti=1;mti<N;mti++){
mt[mti] = 1812433253 * (mt[mti - 1] ^ mt[mti - 1] >> 30) + mti;
}
return self;
}
- (void) twist{
for(int i=0; i< N;i++){
int32_t y = (mt[i] & UPPER_MASK) + (mt[(i + 1) % N] & LOWER_MASK);
mt[i] = y ^ mt[(i + M) % N] >> 1;
if (y % 2 != 0)
{
mt[i] = mt[i] ^ MATRIX_A;
}
}
mti = 0;
}
- (int32_t) nextInt{
if(mti>=N){
[self twist];
}
int64_t y = mt[mti++];
y = y ^ y >> 11;
y = y ^ ((y << 7) & TEMPERING_MASK_B);
y = y ^ ((y << 15) & TEMPERING_MASK_C);
y = y ^ y >> 18;
return (int32_t)y;
}
- (double) nextDouble{
int64_t y = [self nextInt];
int64_t z = [self nextInt];
uint64_t moved_z = (uint32_t)z >> 5;
uint64_t moved_y = (uint64_t)((uint32_t)y >> 6) << 27;
return (moved_y + moved_z) / (double)(1L << 53);
}
@end