vcapra1
vcapra1

Reputation: 2025

JavaScript: how to stop a random number from appearing twice

How can you, in using a random number generator, stop a number from appearing if it has already appeared once?

Here is the current code:

var random = Math.ceil(Math.random() * 24);

But the numbers appear more than once.

Upvotes: 1

Views: 2921

Answers (4)

Marty
Marty

Reputation: 39458

You could put the numbers you generate in an array and then check against that. If the value is found, try again:

var RandomNumber = (function()
{
    // Store used numbers here.
    var _used = [];

    return {

        get: function()
        {
            var random = Math.ceil(Math.random() * 24);
            for(var i = 0; i < _used.length; i++)
            {
                if(_used[i] === random)
                {
                    // Do something here to prevent stack overflow occuring.
                    // For example, you could just reset the _used list when you
                    // hit a length of 24, or return something representing that.
                    return this.get();
                }
            }

            _used.push(random);
            return random;
        }

    }

})();

You can test being able to get all unique values like so:

for(var i = 0; i < 24; i++)
{
    console.log( RandomNumber.get() );
}

The only issue currently is that you will get a stack overflow error if you try and get a random number more times than the amount of possible numbers you can get (in this case 24).

Upvotes: 0

Mmmh mmh
Mmmh mmh

Reputation: 5460

You can use an array of possible values ( I think in your case it will be 24 ) :

var values = [];
for (var i = 1; i <= 24; ++i){
    values.push(i);
}

When you want to pick a random number you just do:

var random = values.splice(Math.random()*values.length,1)[0];

Upvotes: 3

elclanrs
elclanrs

Reputation: 94101

If you know how many numbers you want then it's easy, first create an array:

var arr = [];
for (var i = 0; i <= 24; i++) arr.push(i);

Then you can shuffle it with this little function:

function shuffle(arr) {
  return arr.map(function(val, i) {
    return [Math.random(), i];
  }).sort().map(function(val) {
    return val[1];
  });
}

And use it like so:

console.log(shuffle(arr)); //=> [2,10,15..] random array from 0 to 24

Upvotes: 2

Gorbag
Gorbag

Reputation: 263

You can always use an hashtable and before using the new number, check if it is in there or not. That would work for bigger numbers. Now for 24, you can always shuffle an array.

Upvotes: 1

Related Questions