Floats and integers


I’m a bit confused on how numbers are handled in squirrel. To illustrate this I want to generate a random number between 0 and 255

math.rand() gives a number between 0 and RAND_MAX, so in order to get a float between 0 and 1 i tried to do this:


This however always returned 0! #-o

So I took a step back and tried
server.log(4/5); This returns 0 again. WTF?

Ok, next attempt
server.log(4.0/5.0); this returne 0.8, much better.

But back to my original issue, I tried this, and it seems to finally give me the right numbers, but I’m pretty sure this can’t be the most simple way to do this.
server.log( math.rand()*1.0 / RAND_MAX*1.0 * 255);

So, what is it that I’m missing?

The rule in Squirrel is the same as the rule in C: if both sides of the “/” are integers, the result is the rounded-down integer – otherwise it’s a float. The same is true for the other arithmetic operators such as “*”. So
(math.rand()*256.0) / (RAND_MAX+1)
is probably the simplest way to do it. To make all 256 numbers 0-255 equally likely when rounded down to an integer again, the result needs to range from 0.0 to 255.9999…, not from 0.0 to 255.0.


Interesting, I didn’t know that this was the rule. It’s also a bit confusing to have these strict rules in a language that’s not really strictly typed.
Thanks for the clarification.

On looking at it a bit more, the fact that it’s RAND_MAX (and PI), rather than math.RAND_MAX and math.PI, was unintended. But it’s too late to change now.


Sorry to open this one up again - @peter, @richinminerals how do you actually set the lower values for the random number?