这个实现基本上是从 Wiki 上的 Python 版翻译过来的,大量使用了赋值。

;; Mersenne twister algorithm from Wikipedia
;; returns a closure that returns a pseudo-random integer
;; for each call
;;
(define (make-MT19937 seed)
;; some bitwise procedure alias for short
(define << bitwise-arithmetic-shift-left)
(define >> bitwise-arithmetic-shift-right)
(define xor bitwise-xor) (letrec ((mt (make-vector 624))
(index 624)
;; reset index
(twist
(lambda ()
(for i in (range 624)
(let ((y (bitwise-and
#xffffffff
(+ (bitwise-and (vector-ref mt i)
#x80000000)
(bitwise-and (vector-ref mt (mod (+ i 1) 624))
#x7fffffff)))))
(vector-set! mt i (xor (vector-ref mt (mod (+ i 397) 624))
(>> y 1)))
(when (odd? y)
(vector-set!
mt i (xor (vector-ref mt i) #x9908b0df)))))
(set! index 0)))
;; generates a number
(extract_number
(lambda ()
(when (>= index 624)
(twist))
(let ((y (vector-ref mt index))) (set! y (xor y (>> y 11)))
(set! y (xor y (bitwise-and (<< y 7) 2636928640)))
(set! y (xor y (bitwise-and (<< y 15) 4022730752)))
(set! y (xor y (>> y 18)))
(set! index (+ index 1))
(bitwise-and #xffffffff y))))) (vector-set! mt 0 seed) ;; initialize the vector
(for i in (range 1 624)
(vector-set!
mt
i
(bitwise-and (+ i
(* 1812433253
(bitwise-xor (vector-ref mt (- i 1))
(>> (vector-ref mt (- i 1)) 30))))
#xffffffff)))
;; return a closure
(lambda ()
(extract_number)))) ;; It may be better to set the seed as the system clock
;; but that involves different implementations
(define generator (make-MT19937 4294967296)) ;; the seed (define (randint . arg)
(if (null? arg)
(generator)
(mod (generator) (car arg))))

我使用了自己定义的 for 宏,以及 range 函数来实现 Python 风格的 for 循环,下面是相关的定义:

(define-syntax for
(syntax-rules ()
;; loop in list
;; (for i in '(a b c) do something...)
((_ i in lst body ...)
(let loop ((l lst))
(unless (null? l)
(let ((i (car l)))
body ...
(loop (cdr l)))))))) (define range
(let ((make-range
(lambda (first end step)
(if (or (= step 0)
(> (abs (- (+ first step) end))
(abs (- first end))))
(error 'range "wrong `step' leads to an infinite loop")
(let iter ((cnt first) (result '()))
(cond ((or (and (> step 0) (>= cnt end))
(and (< step 0) (<= cnt end)))
(reverse result))
(else (iter (+ cnt step) (cons cnt result)))))))))
(case-lambda
((a) (make-range 0 a 1))
((a b) (make-range a b 1))
((a b c) (make-range a b c)))))

使用了 R6RS 特有的一些函数及语法,使用时不要忘记在头部加上 (import (rnrs),如果还依赖别的库请查阅 R6RS 文档。

Mersenne twister 随机数算法实现 in Scheme的更多相关文章

  1. 伪随机数生成算法-梅森旋转(Mersenne Twister/MT)

    今天主要是来研究梅森旋转算法,它是用来产生伪随机数的,实际上产生伪随机数的方法有很多种,比如线性同余法, 平方取中法等等.但是这些方法产生的随机数质量往往不是很高,而今天介绍的梅森旋转算法可以产生高质 ...

  2. PHP Math 函数 mt_rand() 使用 Mersenne Twister 算法返回随机整数。

    语法 mt_rand(min,max) 说明 如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之间的伪随机数.例如想要 5 到 15(包括 5 和 15) ...

  3. C语言生成32位和64位随机数算法

    C语言生成32位和64位随机数算法 /** * randstd.h * * Standard definitions and types, Bob Jenkins * * 2015-01-19: re ...

  4. 基于“均态分布”随机数算法的一次性口令OneTimePassword(原创)

    /* 所谓均态分布随机数算法是指:每个数(整数或实数)无序地分布在数轴上,值只出现一次永不重复.体现了香农的一次一密理论. * 均体现在每个数的值是平均概率,即都有出现:态体现在每个数在数轴上的位置是 ...

  5. java基础 - 冒泡排序,随机数算法

    从简单做起 任何困难的事情都是由简单的一步步一件件事情堆起来 理解好算法才是最重要 1.冒泡排序: public class Test { public static void main(String ...

  6. **PHP随机数算法

    <?php $tmp = range(1,30);print_r(array_rand($tmp,10));?> 输出: Array( [0] => 6 [1] => 8 [2 ...

  7. js随机数算法

    function rnd( seed ){ seed = ( seed * 9301 + 49297 ) % 233280; //为何使用这三个数? return seed / ( 233280.0 ...

  8. C/C++ 开源库及示例代码

    C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...

  9. PHP Math 函数

    abs() 绝对值. 3 acos() 反余弦. 3 acosh() 反双曲余弦. 4 asin() 反正弦. 3 asinh() 反双曲正弦. 4 atan() 反正切. 3 atan2() 两个参 ...

随机推荐

  1. 微软Microsoft开源历程与相关资源

    2001 Open source is bad for business, saysMicrosoft Linux is a cancer 2005 Enterprise Library 1.0 re ...

  2. SOA实践之基于服务总线的设计

    在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...

  3. jQuery手机端触摸卡片切换效果

    效果:http://hovertree.com/code/run/jquery/a1gr3gm9.html 可以用手机查看效果. 代码如下: <!doctype html> <htm ...

  4. css3之3d导航

    css3的新属性非常不错,目前IE除外其他浏览器都已支持 实现原理:比如元素a在hover时候可以改变元素b的状态. 效果如本农导航,欢迎采用和建议~ a:hover b{ 执行简单动画效果 } HT ...

  5. iOS AutoLayout的用法

    添加约束 代码实现Autolayout的步骤 利用NSLayoutConstraint类创建具体的约束对象 添加约束对象到相应的view上 - (void)addConstraint:(NSLayou ...

  6. Linux0.11内核--加载可执行二进制文件之1.copy_strings

    从现在开始就是分析最后的核心模块exec.c了,分析完这个文件后,就会和之前的所有分析形成一个环路,从创建进程.加载进程程序到进程调度.内存管理. exec.c的核心do_execve函数很长,而且用 ...

  7. iOS 陀螺仪,加速度计

    atan2(x, y)反正切函数  x是对边  y临边 data.acceleration  加速度值,当手机水平放置时值为(0,0,-1),当手机竖直放置时值为(0,-1,0),判断手机拿起状态可以 ...

  8. SQL Server 2012 安装图解教程

    在安装微软最新数据库SQL Server 2012之前,编者先确定一下安装环境:Windonws 7 SP1,32位操作系统.CPU是2.1GHz赛扬双核T3500,内存2.93GB 安装SQL Se ...

  9. Python 常用模块之time&datetime 和random

    本节大纲: 模块介绍 time &datetime模块 random 一.模块介绍: 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他 ...

  10. 大数据系统之监控系统(二)Flume的扩展

    一些需求是原生Flume无法满足的,因此,基于开源的Flume我们增加了许多功能. EventDeserializer的缺陷 Flume的每一个source对应的deserializer必须实现接口E ...