Random 在Clojure中,为什么rand int的使用如此复杂?

Random 在Clojure中,为什么rand int的使用如此复杂?,random,clojure,Random,Clojure,为什么要使用(reduce+(conj[](repeat 1(rand int 100000)))而不是简单地使用(list(rand int 100000))来返回等效结果,即一个伪随机选择的整数列表 random int函数的较长版本来自Carin Meier的书中关于core.async的章节,用于模拟服务器响应所需的时间 。。。我们将模拟调用它们[两个不同的服务器],并让其随机花费一定的时间。此随机时间量将是一个名为random add的函数。它使用一个rand int函数来选择一个介于

为什么要使用
(reduce+(conj[](repeat 1(rand int 100000)))
而不是简单地使用
(list(rand int 100000))
来返回等效结果,即一个伪随机选择的整数列表

random int函数的较长版本来自Carin Meier的书中关于core.async的章节,用于模拟服务器响应所需的时间

。。。我们将模拟调用它们[两个不同的服务器],并让其随机花费一定的时间。此随机时间量将是一个名为
random add
的函数。它使用一个
rand int
函数来选择一个介于0和100000之间的随机整数然后它在一个函数中使用它,该函数将对填充有随机长度的数字1的向量求和:

(defn random-add []
    (reduce + (conj [] (repeat 1 (rand-int 100000)))))
[重点补充]

我是一个初学者,同样也不知道它有什么优势,例如:

(defn random-add-lite [] 
    (list (rand-int 100000)))
据我所知,在我的回复中,结果是相当的。有什么区别?它有什么帮助

谢谢

编辑

下面是本书
core.async
示例中的整个
core.clj
文件,以便感兴趣的人可以了解
rand int
函数的使用方法。我仍然不明白,但想象一下,像Carin Meier这样有能力的开发人员一定有原因

(ns async-tea-party.core)
(:gen类)
(:require[clojure.core.async:as async]))
(def谷歌茶服务chan(异步/chan 10))
(def yahoo茶服务chan(异步/chan 10))
(def结果通道(异步/通道10))
(defn随机添加[]
(减少+(联合[](重复1(兰特整100000())))
(defn请求谷歌茶服务[]
(异步/去
(随机添加)
(async/>!谷歌茶服务
“谷歌茶叶公司”))
(defn请求雅虎茶叶服务[]
(异步/去
(随机添加)
(async/>!雅虎茶服务
“雅虎茶叶公司”))
(defn请求tea[]
(请求谷歌茶服务)
(请求雅虎茶服务)
(异步/前进(让[v](异步/高度)!
[谷歌茶服务]
雅虎茶服务(陈冯富珍)]
(async/>!result chan v)))
(定义-主参数[&args]
;待办事项——只要求一杯似乎是浪费
喝茶——至少1000杯
(println“请求茶”)
(请求喝茶)
(println(异步)/

关键是书中的这句话(我的重点):

…我们将模拟调用它们[两个不同的服务器]并随机花费时间

您建议的函数只执行
(列表(rand int 100000))
确实会产生类似的结果,而且效率会高得多。你的直觉是对的。但本书中的功能是故意的低效的,目的是为了模拟连接到远程服务器,返回结果需要未知的时间。因此,在这种情况下,低效的功能对于本书的作者所要做的事情,on更好。您的函数将以恒定且可预测的时间返回,这将(在本例中)破坏目的


更新:我刚刚检查,@noisesmith正确地指出,
repeat
的参数被交换。作者试图创建一个只包含1s的随机长度列表,但实际上她创建了一个包含随机整数的长度为1的列表。她应该编写
(repeat(rand int 100000)1)

我想知道这里是否交换了要重复的参数?因为如果交换了参数顺序,粗体的注释会更有意义(调用reduce的奇怪步骤也是如此)。是的,我刚刚检查了,要重复的参数被交换了。它们应该是
(repeat(rand int 100000)1)
,这将创建一个随机长度的列表。相反,作者错误地创建了一个长度为1的列表,其中包含一个随机整数,这不是她想要的。有关详细信息,请参阅下面的我的答案。由于您和noisesmith,谜团已解。这现在是有意义的。
  (ns async-tea-party.core
(:gen-class)
(:require [clojure.core.async :as async]))

(def google-tea-service-chan (async/chan 10))
(def yahoo-tea-service-chan (async/chan 10))
(def result-chan (async/chan 10))

(defn random-add []
  (reduce + (conj [] (repeat 1 (rand-int 100000)))))

(defn request-google-tea-service []
  (async/go
    (random-add)
    (async/>! google-tea-service-chan
              "tea complimemts of google")))

(defn request-yahoo-tea-service []
  (async/go
    (random-add)
    (async/>! yahoo-tea-service-chan
              "tea complimemts of yahoo")))

(defn request-tea []
  (request-google-tea-service)
  (request-yahoo-tea-service)
  (async/go (let [[v] (async/alts!
                       [google-tea-service-chan
                       yahoo-tea-service-chan])]
              (async/>! result-chan v))))

(defn -main [& args]
  ;; TODO - it seems wasteful to only request one cup
  ;; of tea - so do at least 1000
  (println "Requesting tea")
  (request-tea)
  (println (async/<!! result-chan)))