Moshe Shaham
Moshe Shaham

Reputation: 15994

javascript - generate a new random number

I have a variable that has a number between 1-3.

I need to randomly generate a new number between 1-3 but it must not be the same as the last one.

It happens in a loop hundreds of times.

What is the most efficient way of doing this?

Upvotes: 3

Views: 4140

Answers (6)

filype
filype

Reputation: 8410

The code is tested and it does for what you are after.

var RandomNumber = {

    lastSelected: 0,

    generate: function() {

        var random = Math.floor(Math.random()*3)+1;

        if(random == this.lastSelected) {
            generateNumber();
        }
        else {
            this.lastSelected = random;
            return random;
        }
    }
}


RandomNumber.generate();

Upvotes: 0

Bergi
Bergi

Reputation: 665574

var x = 1; // or 2 or 3
// this generates a new x out of [1,2,3] which is != x
x = (Math.floor(2*Math.random())+x) % 3 + 1;

Upvotes: 1

lum
lum

Reputation: 1543

May the powers of modular arithmetic help you!!

This function does what you want using the modulo operator:

/**
 * generate(1) will produce 2 or 3 with probablity .5
 * generate(2) will produce 1 or 3 with probablity .5
 * ... you get the idea.
 */
function generate(nb) {
    rnd = Math.round(Math.random())
    return 1 + (nb + rnd) % 3
}

if you want to avoid a function call, you can inline the code.

Upvotes: 5

freakish
freakish

Reputation: 56587

As Widor commented generating such a number is equivalent to generating a number with probability 0.5. So you can try something like this (not tested):

var x; /* your starting number: 1,2 or 3 */
var y = Math.round(Math.random()); /* generates 0 or 1 */

var i = 0;
var res = i+1;
while (i < y) {
   res = i+1;
   i++;
   if (i+1 == x) i++;
}

Upvotes: 0

Spoike
Spoike

Reputation: 121860

You can randomly generate numbers with the random number generator built in to javascript. You need to use Math.random().

If you're push()-ing into an array, you can always check if the previously inserted one is the same number, thus you regenerate the number. Here is an example:

var randomArr = [];
var count = 100;
var max = 3;
var min = 1;

while (randomArr.length < count) {
    var r = Math.floor(Math.random() * (max - min) + min);

    if (randomArr.length == 0) {
        // start condition
        randomArr.push(r); 
    } else if (randomArr[randomArr.length-1] !== r) { 
        // if the previous value is not the same 
        // then push that value into the array
        randomArr.push(r);
    }
}

Upvotes: 0

gabitzish
gabitzish

Reputation: 9691

Here is a jsFiddle that solves your problem : http://jsfiddle.net/AsMWG/

I've created an array containing 1,2,3 and first I select any number and swap it with the last element. Then I only pick elements from position 0 and 1, and swap them with last element.

Upvotes: 2

Related Questions