I managed to create a pair of numbers with code
(defn dart-throwing []
[(- (* 2 (rand-int 2)) 1) (- (* 2 (rand-int 2)) 1)])
(def onetrial (dart-throwing))
But I do not know how to create my win condition which would be x^2 y^2 < 1
I tried writing
(defn won? [x y]
(< ( (* x x) (* y y)) 1))
(won? onetrial)
I expected it to check the pair []
from dart-throwing and check if it was less than 1 giving a true or false
I would appreciate it if I had some help, thank you
CodePudding user response:
Your won?
function expects two arguments, an x
and a y
. Your onetrial
is a vector of two elements, but it is a single argument here.
You have a couple of options:
You can use apply to 'spread' the vector into the argument list.
(apply won? onetrial)
OR
You can rewrite won?
slightly using destructuring
(defn won? [[x y]]
(< ( (* x x) (* y y)) 1))
CodePudding user response:
Your code does the same like:
(defn dart-throwing []
[(rand-nth [-1 1])
(rand-nth [-1 1])
(def onetrial (dart-throwing))
rand-nth
chooses deliberately from the given collection - in this case -1
and 1
.
And here is the problem: -1 squared is 1 - so ( (* x x) (* y y))
will never be <
than 1.
So: What is the point of the won?
function?
Or shouldn't dart-throwing return some float between -1 and 1? a selection from the range? In this case rand-int
is wrong. It must be then rand
.
so, instead of (- (* 2 (rand-int 2)) 1)
it should be then (- (* 2 (rand)) 1)
. However, rand
excludes the upper limit - in this case 1
. One could send the upper limit to 1 Float/MIN_VALUE
to include 1. Or one keeps it but randomly choose between -1 and 1 and multiply them with the result - then one would get 1 included ... - but it wouldn't be a even distribution ...