むらたです.

random.c で定義されている limited_big_rand 内で,
SIZEOF_BDIGITS == 2 のときに Segmentation Fault が発生する可能性があります.
メールの最後に修正パッチを添付します.

ところで,[ruby-dev:30954] から始まる乱数生成器の仕様の話がとても気になっています.
現状はどのようになっているのでしょう?研究で乱数を良く使用するので,
私も議論に混ぜていただけると大変嬉しいです.

--
Kenta Murata
OpenPGP FP = FA26 35D7 4F98 3498 0810 E0D5 F213 966F E9EB 0BCC

diff --git a/random.c b/random.c
index 9bcc3b9..e59a0b2 100644
--- a/random.c
+++ b/random.c
@@ -386,10 +386,10 @@ limited_big_rand(struct RBignum *limit)
    RBIGNUM_SET_SIGN(val, 1);
 #if SIZEOF_BDIGITS == 2
 # define BIG_GET32(big,i) (RBIGNUM_DIGITS(big)[(i)*2] | \
-                           ((i)*2+1 < RBIGNUM_DIGITS(big) ?
(RBIGNUM_DIGITS(big)[(i)*2+1] << 16) \
+                           ((i)*2+1 < RBIGNUM_LEN(big) ?
(RBIGNUM_DIGITS(big)[(i)*2+1] << 16) \
                                                 : 0))
 # define BIG_SET32(big,i,d) ((RBIGNUM_DIGITS(big)[(i)*2] = (d) & 0xffff), \
-                             ((i)*2+1 < RBIGNUM_DIGITS(big) ?
(RBIGNUM_DIGITS(big)[(i)*2+1] = (d) >> 16) \
+                             ((i)*2+1 < RBIGNUM_LEN(big) ?
(RBIGNUM_DIGITS(big)[(i)*2+1] = (d) >> 16) \
                                                   : 0))
 #else
    /* SIZEOF_BDIGITS == 4 */