You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:15:07