Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript: Random number out of 5, no repeat until all have been used

I am using the below code to assign a random class (out of five) to each individual image on my page.

$(this).addClass('color-' + (Math.floor(Math.random() * 5) + 1));

It's working great but I want to make it so that there are never two of the same class in a row.

Even better would be if there were never two of the same in a row, and it also did not use any class more than once until all 5 had been used... As in, remove each used class from the array until all of them have been used, then start again, not allowing the last of the previous 5 and the first of the next 5 to be the same color.

Hope that makes sense, and thanks in advance for any help.

like image 913
user2860129 Avatar asked Oct 14 '13 00:10

user2860129


People also ask

How does JavaScript generate 5 random numbers?

Generating Javascript Random Numbers Javascript creates pseudo-random numbers with the function Math. random() . This function takes no parameters and creates a random decimal number between 0 and 1.

How do you limit Math random in JavaScript?

Generate a random number with a Max limit To do this, we would multiply the random number by 100. Math. random() will not return 1, so the value will be below 100.

How do you generate a unique random number?

In a column, use =RAND() formula to generate a set of random numbers between 0 and 1.


2 Answers

You need to create an array of the possible values and each time you retrieve a random index from the array to use one of the values, you remove it from the array.

Here's a general purpose random function that will not repeat until all values have been used. You can call this and then just add this index onto the end of your class name.

var uniqueRandoms = [];
var numRandoms = 5;
function makeUniqueRandom() {
    // refill the array if needed
    if (!uniqueRandoms.length) {
        for (var i = 0; i < numRandoms; i++) {
            uniqueRandoms.push(i);
        }
    }
    var index = Math.floor(Math.random() * uniqueRandoms.length);
    var val = uniqueRandoms[index];

    // now remove that value from the array
    uniqueRandoms.splice(index, 1);

    return val;

}

Working demo: http://jsfiddle.net/jfriend00/H9bLH/


So, your code would just be this:

$(this).addClass('color-' + (makeUniqueRandom() + 1));

Here's an object oriented form that will allow more than one of these to be used in different places in your app:

// if only one argument is passed, it will assume that is the high
// limit and the low limit will be set to zero
// so you can use either r = new randomeGenerator(9);
// or r = new randomGenerator(0, 9);
function randomGenerator(low, high) {
    if (arguments.length < 2) {
        high = low;
        low = 0;
    }
    this.low = low;
    this.high = high;
    this.reset();
}

randomGenerator.prototype = {
    reset: function() {
        this.remaining = [];
        for (var i = this.low; i <= this.high; i++) {
            this.remaining.push(i);
        }
    },
    get: function() {
        if (!this.remaining.length) {
            this.reset();
        }
        var index = Math.floor(Math.random() * this.remaining.length);
        var val = this.remaining[index];
        this.remaining.splice(index, 1);
        return val;        
    }
}

Sample Usage:

var r = new randomGenerator(1, 9);
var rand1 = r.get();
var rand2 = r.get();

Working demo: http://jsfiddle.net/jfriend00/q36Lk4hk/

like image 106
jfriend00 Avatar answered Oct 02 '22 00:10

jfriend00


You can do something like this using an array and the splice method:

var classes = ["color-1", "color-2", "color-3", "color-4", "color-5"];
for(i = 0;i < 5; i++){
  var randomPosition = Math.floor(Math.random() * classes.length);
  var selected = classes.splice(randomPosition,1);
  console.log(selected);
  alert(selected);
}
like image 26
Johann Echavarria Avatar answered Oct 02 '22 00:10

Johann Echavarria