hello all, I just ran into something interesting. I was just playing around
trying different things out and ended up coming across this. if I do
something like this:
num = rand(10)
5.times {puts num}
that will give me the same random number 5 times (ie. 2 2 2 2 2). but if I
do the same thing but don't store the random number in a variable:
5.times {puts rand(10)}
then it works as expected (2 6 1 1 9 4). does anyone know why that is? and
if I did want to store a random value in a variable, how would i then do so
without getting the same number every time I call it?
if I do something like this:
num = rand(10)
5.times {puts num}
that will give me the same random number 5 times (ie. 2 2 2 2 2). but if I
do the same thing but don't store the random number in a variable:
5.times {puts rand(10)}
then it works as expected (2 6 1 1 9 4). does anyone know why that is?
It's doing exactly what you told it to do, not what you *meant*.
That's a very annoying habit computers often seem to have.
Computer programming is the art of giving precise instructions to a
very fast and very literal-minded *idiot*, who has absolutely zero
skills about interpreting what you really meant. So, to understand
what's going on, pretend that instead of writing Ruby to a computer,
you are speaking to a person. He's a very stupid person who only
understands the very simplest instructions. However, he can do things
very quickly, he will do exactly as instructed (if at all possible),
and if you give a *name* to a set of instructions, he can remember
what instructions that name referred to, so that you can reference
that name in later instructions.
So the first conversation is like this:
YOU: Write down the word "num" on a piece of paper.
HIM: Okay. {writes word}
YOU: Roll this ten-sided die, and whatever number comes up, write
that underneath the word "num" on that piece of paper.
HIM: Okay. {rolls die, it comes up 2, he writes 2 under "num"}
YOU: When I say "execute block", what I mean is, that number you
just wrote underneath "num", write that on the next empty line on this
other piece of paper.
HIM: Okay. {remembers what "execute block" means -- but doesn't *do* it yet}
YOU: Execute block, five times.
HIM: Okay. {writes 2 five times on the second piece of paper}
While what you *really* wanted, and the second chunk of code would
represent, is:
YOU: When I say "execute block", what I mean is, roll this ten-sided
die, and whatever number comes up, write that on the next empty line
on this piece of paper.
HIM: Okay. {remembers what "execute block" means -- but doesn't *do* it yet}
YOU: Execute block, five times.
HIM: Okay. {five times, he rolls the die and writes whatever number
comes up.}
It's not a matter of storing anything in a variable, it's a matter of
rolling the die again.
and
if I did want to store a random value in a variable, how would i then do so
without getting the same number every time I call it?
It sounds to me like either you're not quite understanding what "store
a value in a variable" means, or I'm not understanding your question.
Once you store a value in a variable, the value does not change unless
you store another value in that same variable. (Barring of course
random accidents like bit-flips caused by hardware interference, some
other thread that has access to that memory changing it, etc.) That's
the main reason we use variables, to store some value we just
calculated (or got as input, or whatever), so we can access that same
value again.
On the other claw, there is a way that "5.times {puts num}" can give
you five (probably) different random value. You could make "num" not
a variable, but a method that returns rand(10). So, when the "puts
num" block is executed, it isn't puts'ing the value of a variable, but
of a method call. Does that help?
For now, I'll leave you to ponder this classic comic strip:
···
On Sun, Nov 27, 2016 at 3:06 PM, Micky Scandal <mickyscandal@gmail.com> wrote:
--
Dave Aronson, consulting software developer of Codosaur.us,
PullRequestRoulette.com, Blog.Codosaur.us, and Dare2XL.com.
thank you that really clears things up. after I posted that I thought about
it some more and that's pretty much what I came up with, but your
explanation was much better (and very amusing).
It sounds to me like either you're not quite understanding what "store
a value in a variable" means, or I'm not understanding your question.
My thought process was that since I assigned num to the result of a method
(rand()) that each time num was called it would run the method instead of
running only once and assigning the result of that one run to num.
···
On Sun, Nov 27, 2016 at 12:41 PM, Dave Aronson < ruby-talk.list.2.TRex@codosaur.us> wrote:
On Sun, Nov 27, 2016 at 3:06 PM, Micky Scandal <mickyscandal@gmail.com> > wrote:
> if I do something like this:
> num = rand(10)
> 5.times {puts num}
> that will give me the same random number 5 times (ie. 2 2 2 2 2). but if
I
> do the same thing but don't store the random number in a variable:
> 5.times {puts rand(10)}
> then it works as expected (2 6 1 1 9 4). does anyone know why that is?It's doing exactly what you told it to do, not what you *meant*.
That's a very annoying habit computers often seem to have.Computer programming is the art of giving precise instructions to a
very fast and very literal-minded *idiot*, who has absolutely zero
skills about interpreting what you really meant. So, to understand
what's going on, pretend that instead of writing Ruby to a computer,
you are speaking to a person. He's a very stupid person who only
understands the very simplest instructions. However, he can do things
very quickly, he will do exactly as instructed (if at all possible),
and if you give a *name* to a set of instructions, he can remember
what instructions that name referred to, so that you can reference
that name in later instructions.So the first conversation is like this:
YOU: Write down the word "num" on a piece of paper.
HIM: Okay. {writes word}
YOU: Roll this ten-sided die, and whatever number comes up, write
that underneath the word "num" on that piece of paper.HIM: Okay. {rolls die, it comes up 2, he writes 2 under "num"}
YOU: When I say "execute block", what I mean is, that number you
just wrote underneath "num", write that on the next empty line on this
other piece of paper.HIM: Okay. {remembers what "execute block" means -- but doesn't *do* it
yet}YOU: Execute block, five times.
HIM: Okay. {writes 2 five times on the second piece of paper}
While what you *really* wanted, and the second chunk of code would
represent, is:YOU: When I say "execute block", what I mean is, roll this ten-sided
die, and whatever number comes up, write that on the next empty line
on this piece of paper.HIM: Okay. {remembers what "execute block" means -- but doesn't *do* it
yet}YOU: Execute block, five times.
HIM: Okay. {five times, he rolls the die and writes whatever number
comes up.}It's not a matter of storing anything in a variable, it's a matter of
rolling the die again.> and
> if I did want to store a random value in a variable, how would i then do
so
> without getting the same number every time I call it?It sounds to me like either you're not quite understanding what "store
a value in a variable" means, or I'm not understanding your question.
Once you store a value in a variable, the value does not change unless
you store another value in that same variable. (Barring of course
random accidents like bit-flips caused by hardware interference, some
other thread that has access to that memory changing it, etc.) That's
the main reason we use variables, to store some value we just
calculated (or got as input, or whatever), so we can access that same
value again.On the other claw, there is a way that "5.times {puts num}" can give
you five (probably) different random value. You could make "num" not
a variable, but a method that returns rand(10). So, when the "puts
num" block is executed, it isn't puts'ing the value of a variable, but
of a method call. Does that help?For now, I'll leave you to ponder this classic comic strip:
--
Dave Aronson, consulting software developer of Codosaur.us,
PullRequestRoulette.com, Blog.Codosaur.us, and Dare2XL.com.Unsubscribe: <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk>
Here are two analogies that might keep clear why that's not what happens:
For one, instead of rand() imagine it was:
some_big_slow_expensive_function_that_I_only_want_to_calculate_once()
For two, imagine it was: STDIN.read()
In either case you want to get the value once and remember it.
That said, it *is* possible to pass around values that "recalculate" every
time they're used (using lambda functions for one, or using special objects
with custom APIs for another.) Usually, though, we just call the function
again.
Cheers
···
On 28 November 2016 at 07:57, Micky Scandal <mickyscandal@gmail.com> wrote:
thank you that really clears things up. after I posted that I thought
about it some more and that's pretty much what I came up with, but your
explanation was much better (and very amusing).It sounds to me like either you're not quite understanding what "store
a value in a variable" means, or I'm not understanding your question.My thought process was that since I assigned num to the result of a method
(rand()) that each time num was called it would run the method instead of
running only once and assigning the result of that one run to num.
--
Matthew Kerwin
http://matthew.kerwin.net.au/
This is such a great definition that I'm going to quote your post the
next time I have to explain computer programming to someone. Thanks for
this little jewel and the corresponding example!
Greetings
Marvin
···
On Sun, Nov 27, 2016 at 03:41:34PM -0500, Dave Aronson wrote:
Computer programming is the art of giving precise instructions to a
very fast and very literal-minded *idiot*, who has absolutely zero
skills about interpreting what you really meant.
--
Blog: http://www.guelkerdev.de
PGP/GPG ID: F1D8799FBCC8BC4F