[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/xDgJGH16    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Sep 7:
; mersenne twister

(define (logand a b)
  (if (or (zero? a) (zero? b)) 0
    (+ (* (logand (floor (/ a 2)) (floor (/ b 2))) 2)
       (if (or (even? a) (even? b)) 0 1))))

(define (logior x y)
  (cond ((= x y) x)
        ((zero? x) y)
        ((zero? y) x)
        (else
          (+ (* (logior (quotient x 2) (quotient y 2)) 2)
            (if (and (even? x) (even? y)) 0 1)))))

(define (logxor a b)
  (cond ((zero? a) b)
        ((zero? b) a)
        (else
         (+ (* (logxor (floor (/ a 2)) (floor (/ b 2))) 2)
            (if (even? a)
                (if (even? b) 0 1)
                (if (even? b) 1 0))))))

(define (ash int cnt)
  (if (negative? cnt)
      (let ((n (expt 2 (- cnt))))
        (if (negative? int)
            (+ -1 (quotient (+ 1 int) n))
            (quotient int n)))
      (* (expt 2 cnt) int)))

(define n 624)
(define m 397)

(define upper-mask #x80000000)
(define lower-mask #x7FFFFFFF)

(define mt (make-vector n 0))
(define mti (+ n 1))
(define mag01 (vector #x0 #x9908B0DF))

(define (sgenrand seed)
  (vector-set! mt 0 (logand seed #xFFFFFFFF))
  (do ((mti 1 (+ mti 1))) ((= mti n))
    (vector-set! mt mti
      (logand (* 69069 (vector-ref mt (- mti 1))) #xFFFFFFFF)))
  (set! mti n))

(define (genrand)
  (when (<= n mti)
    (when (= mti (+ n 1)) (sgenrand 4357))
    (do ((kk 0 (+ kk 1))) ((= kk (- n m)))
      (let ((y (logior
                 (logand (vector-ref mt kk) upper-mask)
                 (logand (vector-ref mt (+ kk 1)) lower-mask))))
        (vector-set! mt kk
          (logxor
            (logxor (vector-ref mt (+ kk m)) (ash y -1))
            (vector-ref mag01 (logand y #x1))))))
    (do ((kk (- n m) (+ kk 1))) ((= kk (- n 1)))
      (let ((y (logior
                 (logand (vector-ref mt kk) upper-mask)
                 (logand (vector-ref mt (+ kk 1)) lower-mask))))
        (vector-set! mt kk
          (logxor
            (logxor (vector-ref mt (+ kk m (- n))) (ash y -1))
            (vector-ref mag01 (logand y #x1))))))
    (let ((y (logior
               (logand (vector-ref mt (- n 1)) upper-mask)
               (logand (vector-ref mt 0) lower-mask))))
      (vector-set! mt (- n 1)
        (logxor
          (logxor (vector-ref mt (- m 1)) (ash y -1))
          (vector-ref mag01 (logand y #x1)))))
    (set! mti 0))
  (let* ((y (vector-ref mt mti))
         (y (logxor y (ash y -11)))
         (y (logxor y (logand (ash y 7) #x9D2C5680)))
         (y (logxor y (logand (ash y 15) #xEFC60000)))
         (y (logxor y (ash y -18))))
    (set! mti (+ mti 1))
    y))

(define (test-rand)
  (sgenrand 4357)
  (do ((j 0 (+ j 1))) ((= j 1000))
    (display (genrand))
    (if (= (modulo j 8) 7) (newline) (display " "))))

(test-rand)


Output:
3510405877 4290933890 2191955339 564929546 152112058 4262624192 2687398418 268830360
1763988213 578848526 4212814465 3596577449 4146913070 950422373 1908844540 1452005258
3029421110 142578355 1583761762 1816660702 2530498888 1339965000 3874409922 3044234909
1962617717 2324289180 310281170 981016607 908202274 3371937721 2244849493 675678546
3196822098 1040470160 3059612017 3055400130 2826830282 2884538137 3090587696 2262235068
3506294894 2080537739 1636797501 4292933080 2037904983 2465694618 1249751105 30084166
112252926 1333718913 880414402 334691897 3337628481 17084333 1070118630 2111543209
1129029736 2769716594 198749844 2123740404 3372116884 667945179 1235233343 1413475797
2355129622 3131889314 1361507145 3419810344 3753862504 2643520359 854777807 2823672895
1563137348 2778071293 3360232580 1294979669 2667002587 4095439979 806669383 3717814038
1071953403 3630859637 771361748 1131385020 3697612515 4264844916 1364828348 2863894246
1109863328 3066937191 2778683115 3989613953 859474495 167522376 1094225558 1963711766
1257324636 1729949323 125753755 1068698284 1761594045 2106609220 1033190229 946183933
1100436279 489306665 2385045156 658699819 3308017340 2385997510 105622857 1976233741
1535497010 314176889 1247500738 2138106664 2757078771 2433460811 3970906471 1944201130
2366336502 2541539915 4284982935 224898482 1457988276 2188154237 3655119144 979144237
1279857832 2711710163 4093937260 2299893420 2121869254 2505459837 1847263294 2974457633
3439803738 1672773492 225684598 2496857387 611619631 3993022877 3508398016 1663733971
758566080 1653863133 1701066037 3782883361 3343813716 2602577666 629577870 3724093470
361301181 2674434977 1443899064 4104796692 140754167 4230942998 447458027 743917836
2818315151 1332110941 266033703 308176090 130356650 3074197472 3093392044 1602712035
1856287253 3375970245 3114872063 370413632 1435286098 645351481 908917276 2440368438
1599412846 2500100729 790131292 3684521490 4052663936 1566488352 295035953 4163443199
2997925650 678068969 3667661122 1273385972 3555794914 762012623 1091375739 1765680277
4238179361 3406590822 3797246256 388618876 2160693563 349961032 1392360403 3579025090
604490212 3577823930 2321462651 3790422055 3185735941 2229660586 1128575466 884862908
3330757128 3194168238 681073659 800341641 2006864675 2619636221 1577889182 3575155952
2260116784 3689141878 1657848984 2642380231 2878484564 3099953080 468844464 4134363631
4110639840 1904558184 1937194892 3137602491 3643695698 820242909 3068372731 3388748923
4235603065 2615115373 1555770904 1520951990 1047053830 1663094463 3948465044 1077597088
2996944317 3230974609 2019388652 865275198 2046271241 3163620630 269072378 2253440754
277763586 1114595358 2679817222 988885471 922982460 477046426 1161679484 2950091998
2088879880 3516906501 1403601752 1184069822 3531029460 3041313352 3359174170 2117925252
1529768389 1253051929 1829668776 2678766355 2138924913 3147299808 447212163 1069119222
3791704659 804904386 3580345412 1700215583 904016717 74539975 1288558083 1746888271
437611701 781576281 1166365552 2566333668 4292856916 4076802480 3968908047 3057346051
2074623641 3653637364 586217310 3211306229 2604443978 3303224219 50953535 2118693299
460196852 3355264342 500727351 1681849672 113995187 1200937601 3092561862 312936130
3916083024 2561711416 3713941700 2240434908 637144400 1946468041 3224254139 2242555323
2524984519 945834669 2805199117 1879274691 3792160120 37879558 1205870756 3508020184
2705733735 3134213377 3170077556 9055729 2147895752 3788046325 2422273092 1228026268
1275162816 1385450594 128490357 678715088 2466464403 2715463741 420067866 396072989
1729810791 4146068843 389936193 1010939382 794725144 633726173 3567793282 248988111
1254549356 1989964616 1425389196 2202358947 2830413406 3798927382 3442966168 269966252
2807646342 1794971636 1602977220 1360381486 1805272988 554730358 4259897540 2168740091
442942697 3744617621 3567326073 1232342342 3720210842 303505483 3533762586 2136482547
2813945830 3051833277 2830164695 3157472512 3186113013 1063305342 4133844231 2026873438
94687021 42670911 2205451721 200274097 3184342380 1216199867 1941807482 1902652464
4140258655 1934749011 2626251395 1041046135 3256560316 2005577300 367040511 2562291571
4179257085 394550850 3714400922 3096861476 3729796880 3528309113 1483426196 821348673
2057501468 3141389956 631596202 2325651773 3568751628 2300178836 257777076 3455675689
2853908813 223950412 2320715588 250378269 3557833937 927098460 315421373 1957400381
725633141 3345409284 1114863797 1830809043 1922707457 3785762071 3404751487 2434832700
1359584120 860423718 2979956529 888063953 641814761 180527770 3316862637 4012959929
28566252 1045558574 4131606737 215968520 362234156 2248115936 3069089212 3403600809
1812984601 1768934064 4007586160 1240758160 13887765 3514615109 3827374039 3341198715
1982839159 2033151304 4283902822 3744190534 726223056 3905246635 1875803225 2030522753
2822074688 3325482280 1691268105 3033866845 1716543028 1555574049 2661093496 1979855811
2251933935 1276056752 3341241268 1892612984 2194846054 486586963 2492823590 593230942
775986230 1255789287 2318099602 3056263080 158332807 2451929550 3374135491 372847709
1128359579 373993639 2419119952 829613207 2948211163 2324165819 160722663 1444930279
765460462 3780495422 592264489 316670611 2342138965 1439591408 3362218290 2860902653
1116562887 3033679152 1381679779 1291533463 1962666710 2222373514 1215751045 3569236064
1611254503 1171727980 3057484484 3263787664 3065712276 781477153 1881176626 3769042770
1193467712 2843905090 3437666358 2160717604 419274206 2767079897 4007363510 1325555048
4187736634 4066907010 3299749742 154249616 1941800223 1157563946 705258893 860757803
1310317854 1898329708 3491229573 312822728 3407001878 1029352733 3463910352 2741163037
2705583812 2644345635 683012156 948328240 2656867161 1644147624 2853875853 822059867
753937406 1604103884 1756360543 3400647193 2802766030 2268191056 3784643944 3009927237
394432056 1840177440 2651765924 1205254585 3551482241 2857937506 2522509113 3675764066
1234994787 3459183960 186529857 1329960799 2322397450 1078548606 113242357 2421327506
3306100881 211880652 847202265 1034020264 2374075486 755993425 2474409905 1885945103
3588026819 3326201431 747273957 3172561912 4064603659 2036147813 3539583488 2861164857
3303878586 2385840167 734771685 804646316 1158163327 2080435695 2455811362 2060318701
1223319334 2573853731 3341336861 3207344772 1654544724 1227774824 1779567885 4241425455
3942578957 2787959909 90390016 1235487669 2405269696 4096898260 2121644059 2432007152
2649006803 355642145 3998121079 3524581383 919279000 789586853 2465492036 220701650
2947224279 1329892616 3729919501 1219039514 3006882189 281458735 3800499491 730882493
2222118351 4107301035 2687550208 3260886108 3701859392 3862191362 1412535194 1694757183
772470279 689128388 2265554314 3499902942 2845535450 2570802968 1947307958 4027367903
1910806179 3858889779 4021735452 4078787932 3413032217 2980053565 2148809521 1497338125
2040525958 3112062074 2201881275 3672285015 3003099464 3809697025 3709177038 3264926503
1707537043 1104985157 3691862420 1898692192 2323051094 736562662 2300313916 3100486674
302436891 1288467611 1981059467 3645778636 1609399619 3418162375 3667843152 536318325
3040655354 2544467931 424476355 1601741596 246832728 2677287644 2835422307 1127786001
850991343 2067806155 3766212150 1001927094 3801068881 3242308737 1560596676 1681618985
2562998394 3484825522 2655391996 1746361319 3550836123 4038742826 735255465 3954076606
4101370050 3167012089 1966689481 1576556523 207036082 2337346669 3404885158 3372194402
2313772874 1511011541 3934253759 152017013 2305096656 1003233114 3788182044 2738083629
2667318735 4075851512 3919952624 3934687504 955697805 3721361893 1892740917 1925356403
3530645689 57355987 500963211 3812263275 3120702996 3348394440 2648242605 2950965560
2906248872 4195607563 1976120064 569029796 3204894397 836657553 4253104557 4029524248
1167446730 3164256694 1225943621 978942573 3887954057 4029693733 3371611138 2648127182
341670719 780349063 1249088385 2825987206 1409751402 3493141543 2454446995 3001899542
894695004 4113594037 2748119359 3811278462 337072564 3551268535 4210316453 2857304716
1656016234 3055850193 4074141119 2702683976 3903520288 2708109896 1303194166 676764765
1073839 3417024471 530027902 664548902 3934189521 1118172394 1598501076 1353136139
3556356767 3851436279 787984702 3614996657 2653843342 350845053 2540767452 341795141
4131579558 2852231303 347703279 304754275 3637218358 1191420956 4250273882 2217329477
3619012484 2320390083 1618600250 100602741 3962829626 3325838530 3310041575 2202357234
2410265700 1855854724 1586666379 1893433651 4212894970 3078470962 3005791950 3645097109
2729330720 178175659 1878759843 3613064024 2235022317 1229007963 1217716121 3424643385
2025817426 2541310454 3491127040 834075061 1476080952 527792572 3142617040 990164480
3538861805 1101804820 254185979 2139277356 3053978085 3636278570 1588526078 3265686058
3200724466 3305433961 1714292212 2894641386 286242900 2390694965 1104137642 1729447649
2603147116 1739535876 2332325654 3923517970 975963350 3046750553 4287139816 2887426453
3205373337 2829120066 3989557087 1090404329 2762938959 2016187695 188074317 562585328
1185556641 3980179851 2922039667 3215853289 946979886 2822925104 803185936 1852384677
2297156223 2799487985 1756284627 2317738144 1335401093 674337096 2899555797 3996541014
3014749938 283034558 3481962136 3810308241 2725662577 744192370 3665583468 571653166
3181462357 1782231829 563269281 1274600369 2386970918 363976120 2931953430 614822572
1661454733 449226294 3506516244 3427050773 2620464687 505585754 3256549852 321182353
3890429063 2030404657 1191957414 3469037079 947528907 578915297 2155016115 557136361
374100253 1716551606 1064892772 2282836509 2205887435 735861059 2088833463 3884993958
1520195389 3349226581 4116948321 3654190067 3585109483 2170692034 4104050396 1431760441
871040163 3131221596 4039637966 3255680597 1537348827 4274038615 2766931218 3080056590
2427576150 1698622741 491269657 2957152254 4003327323 1665870563 2898998885 350910601
3377912239 56558544 2757732126 3003019578 3020476484 1103562767 266867533 3238470691
101050052 2174141449 4261294044 3377977245 4283033233 1649319944 2407542500 1186270608
506638155 853299114 528018288 3370360190 3432726533 33304936 746516661 864441540
877624554 549536499 2512486873 1718378202 1877264374 3907125156 3480301523 1222420918
2962412787 1897386667 565602854 870635873 1837265416 2093005006 2069832336 421542850
546177829 3737295211 2022730805 114777545 1045010491 1474827040 7636789 3926378049
825140914 3894878768 2235348820 4209167372 1363271078 1633012431 2604598105 1475584955
363136592 2939993958 3395026321 2769982499 2579982422 3377853512 1926697291 1309179303


Create a new paste based on this one


Comments: