有没有办法在 TCL 8.5 中生成带有种子的伪随机数?

Is there a way to generate Pseudo Random Numbers with a seed in TCL 8.5?

我可以让 rand() 工作,但它只有从 0 到 1 的输出,我不能在其中使用任何种子值。

尝试在 TCL 中制作伪随机数生成器并使用 md5 哈希算法制作类似这样的东西,proc{secretseed length} 输出多个 $length 字节。

I can make the rand() work but it only has the output from 0 to 1 and I can't use any seed value in that.

srand呢?

Tcl 的 rand() 产生在 [0.0, 1.0) 区间内均匀分布的随机数(即允许 return 0.0 而不是 1.0) .它 不是 的密码质量,甚至也不适合与 monte carlo 模拟一起使用(因为没有努力确保底层 RNG 产生良好的频谱分布)。 RNG 的种子可以用特殊的 srand() 函数设置,例如

expr { srand(123) }

要生成范围内的整数,您需要重新缩放数字:

proc random {from to} {
    expr {$from + int(rand() * ($to - $from))}
}

要从列表中随机选择,您可以这样做:

proc pick {list} {
    lindex $list [expr {int(rand() * [llength $list])}]
}