我设法创建了一对代码为的数字
(defn dart-throwing []
[(- (* 2 (rand-int 2)) 1) (- (* 2 (rand-int 2)) 1)])
(def onetrial (dart-throwing))
但我不知道如何创建我的获胜条件,即x^2 + y^2 < 1
我试着写
(defn won? [x y]
(< (+ (* x x) (* y y)) 1))
(won? onetrial)
我希望它能检查投掷飞镖的[]
对,并检查它是否小于1,给出正确或错误的
如果我能得到一些帮助,我将不胜感激,谢谢
您的won?
函数需要两个参数,一个x
和一个y
。您的onetrial
是两个元素的向量,但在这里它是一个单独的参数。
你有几个选择:
您可以使用apply将矢量"展开"到参数列表中。
(apply won? onetrial)
或
您可以使用析构函数稍微重写won?
(defn won? [[x y]]
(< (+ (* x x) (* y y)) 1))
您的代码执行相同的操作:
(defn dart-throwing []
[(rand-nth [-1 1])
(rand-nth [-1 1])
(def onetrial (dart-throwing))
rand-nth
有意从给定集合中进行选择——在本例中为-1
和1
。
问题是:-1的平方是1-所以(+ (* x x) (* y y))
永远不会是<
而不是1。
那么:won?
函数的意义何在?
或者飞镖投掷不应该在-1和1之间返回一些浮动吗?从范围中选择?在这种情况下,rand-int
是错误的。它必须是rand
。所以应该是(- (* 2 (rand)) 1)
而不是(- (* 2 (rand-int 2)) 1)
。但是,rand
排除了上限——在本例中为1
。可以将上限发送到CCD_ 21以包括1。或者保留它,但在-1和1之间随机选择,并将它们与结果相乘-然后得到1…-但这不会是一个公平的分配。。。
据我所见,您得到了一个不正确的抛出实现,返回了组件-1 | 1
而不是-1 | 0 | 1
。
我的建议是这样的:
(defn rand-axis [] (dec (rand-int 3)))
user> (repeatedly 10 rand-axis)
;;=> (-1 -1 0 -1 0 -1 -1 0 1 -1)
然后你只需要在一个尝试功能中使用它:
(defn attempt [] [(rand-axis) (rand-axis)])
CCD_ 24似乎如下所示:
(defn won? [[x y]] (zero? (+ (* x x) (* y y))))
检查:
user> (doseq [att (repeatedly 10 attempt)]
(println (str "throw:t" att "twon?:t" (won? att))))
;; throw: [1 -1] won?: false
;; throw: [-1 1] won?: false
;; throw: [1 -1] won?: false
;; throw: [0 1] won?: false
;; throw: [1 1] won?: false
;; throw: [-1 -1] won?: false
;; throw: [0 1] won?: false
;; throw: [-1 1] won?: false
;; throw: [0 0] won?: true
;; throw: [-1 0] won?: false
此外,由于唯一获胜的情况是[0 0]
,won?
可能是这样的:
(defn won? [pair] (= [0 0] pair))
或者像这样:
(defn won? [[a b]] (= 0 a b))
甚至像这样:
(def won? (comp boolean #{[0 0]}))