MersenneTwister算法 iOS实现

  • .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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值