【问题标题】:Is there a way to generate Pseudo Random Numbers with a seed in TCL 8.5?有没有办法在 TCL 8.5 中生成带有种子的伪随机数?
【发布时间】:2020-02-12 04:23:22
【问题描述】:

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

试图在 TCL 中创建一个伪随机数生成器,并使用 md5 哈希算法来制作类似的东西,proc{secretseed length} 输出一些 $length 字节。

【问题讨论】:

  • rand 不适用于密码学:文档明确指出它使用“简单的线性同余生成器,不是密码安全”。
  • 您能否解释一下为什么需要种子随机数,尤其是对于密码学?通常,应用程序不会播种加密随机数。
  • tcllib 有一些处理随机数的包,fwiw。

标签: random cryptography tcl


【解决方案1】:

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

srand 呢?

【讨论】:

    【解决方案2】:

    Tcl 的 rand() 产生均匀分布在区间 [0.0, 1.0) 上的随机数(即允许返回 0.0 但不能返回 1.0)。它具有加密质量,甚至不适合与蒙特卡罗模拟一起使用(因为没有努力确保底层 RNG 产生良好的频谱分布)。可以使用特殊的srand() 函数设置 RNG 的种子,例如,

    expr { srand(123) }
    

    要从一个范围内生成整数,您需要重新调整数字:

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

    要从列表中随机选择,请执行以下操作:

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

    【讨论】:

    • 如果您需要更好的随机数,请编写自己的代码或使用库。
    猜你喜欢
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2015-05-05
    相关资源
    最近更新 更多