Gauche脚本随机采样始终返回相同值的原因排查
问题:Gauche脚本多次执行始终输出同一随机姓名
我写了一个Gauche脚本用来随机抽取同事姓名,代码如下:
#!/usr/bin/env gosh -b (define-module utils (use data.random :only (samples$ integers-between$)) (use gauche.generator :only (generator->list)) (export generator->first sample1) (define (generator->first gen) (car (generator->list gen 1))) (define (sample1 items) (generator->first (samples$ items)))) (import (utils :only (sample1))) (define team-members (list "billy" "nilly" "silly" "willy")) (define (main args) (print (sample1 team-members)) 0)
但用下面的命令多次执行时,每次输出的都是同一个姓名:
for i in {1..25}; do gosh ./random-team-member done
请问这是什么原因?是否需要初始化随机数生成器?我是否误用了generator->list?
原因与解决方案
问题出在随机数生成器没有初始化种子。Gauche的data.random模块默认使用的随机源,每次脚本启动时都会用固定的默认种子,导致生成的随机序列完全一致,自然每次抽取的结果都相同。
generator->list的用法是没问题的,不用怀疑这个。
解决方法很简单,在脚本里初始化随机数种子就行,通常用当前时间作为种子。你可以在main函数开头添加初始化代码:
修改后的main函数示例:
(define (main args) ;; 初始化随机数生成器种子 (random-source-randomize! default-random-source) (print (sample1 team-members)) 0)
或者也可以用更简便的sys-randomize!函数(需要导入gauche.random模块):
先在模块导入部分添加:
(use gauche.random :only (sys-randomize!))
然后在main里调用:
(sys-randomize! default-random-source)
这样每次脚本启动时都会用不同的种子生成随机序列,多次执行就能得到不同的抽取结果了。
内容的提问来源于stack exchange,提问作者shadowtalker
相关产品推荐
相关产品推荐

