#335 ✓resolved
algorithmic_imperative

Possible (minor) enhancement for Math.random()

Reported by algorithmic_imperative | 2010-08-31 00:03:00 UTC | in 2.0.0 Release

LOW-PRIORITY:

Support for String values could be achieved by converting min to a number with parseInt() or the ~~ double-bitwise operator.

(No conversion necessary for max since it is achieved with the subtraction operator.)

This may not be an intended behavior for the method, but I thought I'd offer it as a possibility as it would simplify code where (for example) the arguments passed are being taken from <input> value, or some other source offering a string.

Math.random = function(i_min, i_max) {
    // Convert min to number ---------vv
  var rand = Math_old_random(), min = ~~i_min, max = i_max;
  if (arguments.length == 0)
    return rand;
  
  if (arguments.length == 1)
    var max = min, min = 0;

  return Math.floor(rand * (max-min+1)+min);
};

Using ~~, non-convertible values return a result of 0 instead of NaN. If NaN is preferred, then parseInt() instead.

Possible alternate version:

Math.random = function(min, max) {
    
  if (arguments.length == 0)
    return Math_old_random();
    
  if (arguments.length == 1)
    max = min, min = 0;
    
  return ~~(Math_old_random() * (max-min+1) + ~~min);
};

Or to support more String values:

Math.random = function(min, max) {

  if (arguments.length == 0)
    return Math_old_random();

  if (arguments.length == 1)
    max = min, min = 0;
  else
    min = parseInt(min);

  return ~~(Math_old_random() * (parseInt(max)-min+1)+min);
};

Comments and changes to this ticket

  • MadRabbit

    MadRabbit 2010-09-01 10:11:21 UTC

    • Milestone set to “2.0.0 Release”
    • Tag changed from “arguments, math.random, string” to “math.random, string”
    • Milestone order changed from “196625” to “0”

    Hi Imperative, a nice trick you've gout in here! Never herd about it before, thanks for that. Will check it out and then include into RightJS 2.0

  • MadRabbit

    MadRabbit 2010-09-01 10:50:23 UTC

    • State changed from “new” to “resolved”

    Seems like working just fine.

  • algorithmic_imperative

    algorithmic_imperative 2010-09-01 17:31:46 UTC

    MadRabbit - Of the three versions I posted, I guess I'd lean toward the last one. It will offer the most possibilities for string values.

    For example, it could accept values line "50px", which may be useful for passing the value of style properties.

       // Set height to random value between the current height and 250
    element.style.height = Math.random(element.style.height, 250) + "px";
    
  • MadRabbit

    MadRabbit 2010-09-01 17:43:47 UTC

    hmm... sounds a bit naughty to me, besides you always can call it like that

    element.setHeight(Math.random(element.size().y, 250));
    

    which is more explicitly saying what's going on

  • algorithmic_imperative

    algorithmic_imperative 2010-09-01 20:30:10 UTC

    MadRabbit - Very true, and perhaps a little naughty. :o) The main point was that using parseInt() would allow for additional valid arguments. Not a big deal, though.

    One question, if you don't mind me going a little off topic here. I noticed in some of your Number methods, you add 0 to this.

    For example:

      min: function(value) {
        return this < value ? value : this + 0;  // 0 is added when returning the Number
      },
    

    Just curious about it.

  • MadRabbit

    MadRabbit 2010-09-01 20:37:11 UTC

    that's simple type-conversion

    typeof(new Number(8));     // -> 'object'
    typeof(new Number(8) + 0); // -> 'number'
    

    If you simply return this it will carry all those additional methods like a number which sometimes causes problems. So I simply convert it back to a number.

  • algorithmic_imperative

Please Sign in or create a free account to add a new ticket.

With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.

New-ticket Create new ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile ยป

RightJS Core Tickets

Shared Ticket Bins

People watching this ticket

Pages