用于创建具有随机数字和获胜条件的简化飞镖游戏的函数



我设法创建了一对代码为的数字

(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有意从给定集合中进行选择——在本例中为-11

问题是:-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]}))

最新更新