💾 Archived View for thrig.me › blog › 2024 › 02 › 23 › more-random-things.gmi captured on 2024-03-21 at 15:04:27. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
The Common LISP random number generator, at least in SBCL, is prone to spam perhaps excessive amounts of state. This state is probably good if you're doing long-running simulations where the RNG repeating too soon would be bad, but for other use cases, well, no news is good news.
* (make-random-state t) #S(RANDOM-STATE :STATE #.(MAKE-ARRAY 627 :ELEMENT-TYPE '(UNSIGNED-BYTE 32) :INITIAL-CONTENTS '(0 2567483615 624 2147483648 4285120072 790625551 806089414 643877523 1398349795 1003288948 3376820311 1251311338 3638470350 1718892353 1185154100 3359924261 515488018 381377806 322159287 3812999515 3225400745 2597786072 4233373679 2687758388 2830647210 2118189795 3198981874 1916482668 3024808960 2429435080 3912451820 3020611691 3236731632 94393848 1979246812 3703957079 1707533127 1316047713 396258217 982224471 3930783048 2130080730 2252875951 1584372533 1030243661 996233217 498310445 945602594 1456473441 1697245719 2666441129 2760993133 2632902673 970769671 1649780465 3510841812 2458234640 4270931870 1646748023 952669647 817164534 1562599298 480437400 3667222141 2028732837 4237354694 1000414538 467263198 1967150664 1303887997 2389236246 3245374476 1651029302 1644168880 3060324617 2552591437 4087177518 720144015 3026818892 2499790443 210157217 90639555 225838209 3164034997 3763165098 810383068 61039420 3185906301 2649349239 2382756530 2968146797 4229761360 3379716700 4254762986 2851435914 713059131 4230934772 1996489676 1759090856 3876910842 2177311075 720902797 1620425672 1395620575 820235657 3399361250 1820022406 3411189300 2075419057 3027160258 3007456140 832899161 4260016341 275807696 1019825708 4109951726 1647706143 2620583305 3294892591 2640955962 1765255940 98734299 4051772382 1847893553 2588283793 1733778977 1107143179 641029886 3644107597 1685637515 2306680536 3621725066 2114363064 4164418800 3172571868 1979334571 4103765488 867623714 2533085414 2725890402 495267924 1944721839 2406955579 1356041298 2494185188 2498843554 2463937299 1143711601 3089873800 1299534847 1803392553 2820123383 3403602838 660383412 2599671748 2247830118 1178726849 221832501 1493205903 2033227709 1781607788 1443647761 1653138778 2613098745 586925342 2542644716 2857264794 421861946 465545362 3004833968 4067646280 521184539 812879335 3197835686 623634686 3297738546 201647149 1842767724 3833007083 558819394 3444700256 1470076023 459797534 4214663824 2761738451 1319615351 475583632 1791943318 3507833806 3748757250 2693286101 2078209049 530640521 3530833126 3521715094 2370258381 4027459218 4223585235 1386814281 1395540440 3112005942 3800041797 1347365639 665423763 628843472 749801773 574886928 397574748 2769983639 971122002 3733754590 837952908 3866824979 213053338 2292463172 1859806870 1275364992 1559242569 3787986740 2254088069 568383155 4050287820 2189979846 1569864381 606291185 2853782318 3480789009 4179848204 3185723743 186323670 3696866371 2052508568 172592184 980200051 2665981826 3151238806 931492153 328636017 3894988017 2940813625 2724299361 3230820073 2468886937 2970883478 751462797 3206425310 306117684 1588493215 1515372742 1903608772 1765775884 643982141 3638021045 3237245339 4151158129 2953787103 3941237774 1121322567 468885759 3867821095 247024094 4212446595 1539163746 3882670501 2122477068 4291659264 3911439598 155614296 215244114 1189094627 1309074575 2135609211 740292611 991571429 16021390 3272609427 3972988995 1155531950 2928666457 3117410289 3650085444 1397771904 1035411419 4275743913 3072451362 219135819 3480623232 1536052877 1116934529 365567360 3301081424 756257943 1144423689 259400196 528144896 4072693846 2840797382 3519077589 2199804170 1501895764 3473084781 3723938681 1794670575 2645056437 2871007967 3255646344 2129079576 1557543842 2064919772 2650092597 3387637223 3000796502 3787884647 870943834 4292752727 1468556023 2507036077 258637600 2320022570 1932350766 1815354667 3048995666 1332969764 2932084897 353502737 1586489545 2143588842 3921748618 4133404089 1249578871 2316141723 2431447177 2356763202 1017720156 527879690 3550242309 779567636 2329348272 3861271553 613325894 513151275 380352027 489117241 3357082410 3560494942 3963089040 1974144464 2221342044 349320754 38957239 946698155 1202283893 3179465607 2893758968 3134716057 389370128 1573553891 3644687777 2109664463 3929472705 1779241652 3595484528 349358706 3818515217 1317249920 3908308198 896951312 4002133369 3359781843 2822948826 2464329025 3440026567 2854376471 1156313020 1554886326 2665423619 1910313684 332452893 2013928375 2459599358 2967923163 3017082786 2787307516 986240091 4011390527 2824796302 352726291 448684034 2009073246 2643478771 533338937 504751959 1648868066 2451495190 2100892595 427139187 2936874216 2677898043 2062010089 3251839938 3112471858 658440192 3808318009 1507963410 1401851942 110520407 299420730 1527947494 146587081 118480894 786964507 4282138417 1253497401 2309640565 382328599 3510902269 1762806213 1162946753 2522644240 4054209770 2391504131 4162246690 871149892 2676140192 474142602 2903751253 3562900988 1528797149 2974295391 4029576741 2209786432 325120225 2849390297 1973010842 2369908729 2019168403 2590089101 60719547 1512643724 1427327694 2644347692 1104130949 3657866776 2121515211 747270204 3423913508 529177020 1952564873 4052123724 969882260 4175373180 1885702646 2999721028 2177180009 1720323831 398897502 1389833894 308868655 2231714749 635860963 2469573079 2554251694 1417624361 2600574645 3809379778 1180571536 19727870 525004143 1397533911 357769304 457893049 3018314168 3251528088 2089823621 1793540182 3500073771 4179359099 1281669975 162390953 1004853581 2624390318 1551086394 1752726256 1840912040 967504941 3631112809 3274127409 1305490885 187878381 3033380819 3411417157 793237282 1496523026 2087088320 2337843954 3430133101 39911119 3153090630 2355762135 2554717092 1809421974 527224848 1361483012 1472627846 1707419841 3662823151 3519552494 1866113149 1647941457 1901938464 3666681490 2657499161 3257354091 3367377304 705485852 260233250 748770219 3425240824 2377562458 1487156635 3360310541 384390307 1606020554 2453789037 3189588590 2549923229 756196601 2906113561 1393105132 273307174 3210511621 2634346581 336219965 1663561528 4121479446 251905475 2751563885 2233858357 1726454249 1314317141 3979795153 3167616183 893237906 2169982043 4157767852 499537055 2619857477 3977413420 1255314986 3784996610 3997349117 1097528373 602277015 1421414521 1968356332 1686345266 2510741972 313271016 3797191644 173309171 1625544062 430322318 3220211152 3690827047 607225526 2711449835 3407804756 2217659787 2973697245 2251797977 1963690477 1077482723 269858689 1346951276 4170766007 1368633827 3168616232 1914989236 342046797 1890849 437767220 2166470542 67006529 525022941 3954814824 2584386564 3329298779 2721196819 2424729857 3004006620 1256684336 3022803899 670165317 3525983737 3264487256 874207999 1841686698 3641865218 1722347056 1277268228 1960487307 27058671 1877015065 1004241290 201293445 1066175046 1064514126 467448476 3133798205 417054319 3659686668 1336434104 3725758337 3623569376 1718370762 1468941092 2442778598 1209620487 3422947888 2933892757 842415338 3774758510 1016191096 4186128331 2091487022 2489831840 2754411346))) *
You probably get the idea, readers who are still with me after that. Of course this output can be hidden in various ways;
* (block nil (setq *random-state* (make-random-state t)) (return)) NIL
though in some cases you may want to save the state somewhere so you can get back to it. Probably less so in a simulation, and moreso in a game or music-making where something notable happened and you want to reproduce that. Two options come to mind: first, use a different RNG with an easier to save seed, perhaps one that is seeded with a 32-bit integer; second, persist the state to a file.
(defun random-save (&optional (file "seed")) (with-open-file (stream file :direction :output :if-exists :overwrite :if-does-not-exist :create) (block nil (prin1 (make-random-state nil) stream) (return)))) (defun random-load (&optional (file "seed")) (with-open-file (stream file) (block nil (setq *random-state* (read stream)) (return))))
A problem is that the code (and possibly also a synthesizer) may also be fiddled around with. Maybe use frequent commits into a version control system? A digital synthesizer could expose its RNG via MIDI so that could also be reset to some known state. Or ignore the problem and do not step in the same stream twice.
Testing that the code (probably) does the right thing is good.
* (block nil (setq *random-state* (make-random-state t)) (return)) NIL * (random-save) NIL * (loop repeat 40 do (format t "~a " (random 10))) 1 8 4 0 1 6 3 6 1 1 7 8 3 6 4 5 8 0 5 1 4 2 0 6 5 4 5 7 3 2 1 5 5 4 7 2 7 6 1 6 NIL * (loop repeat 40 do (format t "~a " (random 10))) 8 4 6 9 8 3 4 8 9 5 1 9 5 4 3 5 0 4 7 5 8 0 7 4 5 1 3 4 8 7 1 7 5 9 1 3 1 1 5 9 NIL * (random-load) NIL * (loop repeat 40 do (format t "~a " (random 10))) 1 8 4 0 1 6 3 6 1 1 7 8 3 6 4 5 8 0 5 1 4 2 0 6 5 4 5 7 3 2 1 5 5 4 7 2 7 6 1 6 NIL
This code (and the tests for it!) should be shoved off into a utility package, probably with other common (for me) random routines like coinflip, one-in-n, shuffle, picking a random element from a sequence, removing a random element, rolling dice, and so forth. Some of such routines can be found in the Alexandria package.
Speaking of putting things into libraries…