markmnl
markmnl

Reputation: 11426

How to get a unique random integer in a certain range for every number in that range in javascript?

I have:

function getRandomInt(min, max){
        return Math.floor(Math.random() * (max - min + 1)) + min;
}

But the problem is I want randomise the population of something with elements in an array (so they do not appear in the same order every time in the thing I am populating) so I need to ensure the number returned is unique compared to the other numbers so far.

So instead of:

   for(var i = 0; i < myArray.length; i++) {

   }

I have:

var i;
var count = 0;
while(count < myArray.length){
  count++;
  i = getRandomInt(0, myArray.length); // TODO ensure value is unique

  // do stuff with myArray[i];
}

Upvotes: 0

Views: 325

Answers (4)

David Steele
David Steele

Reputation: 3461

You can pass in a function to the Array.Sort method. If this function returns a value that is randomly above or below zero then your array will be randomly sorted.

myarray.sort(function() {return 0.5 - Math.random()})

should do the trick for you without you having to worry about whether or not every random number is unique.

No loops and very simple.

Upvotes: 1

Kerrek SB
Kerrek SB

Reputation: 477110

It looks like rather than independent uniform random numbers you rather want a random permutation of the set {1, 2, 3, ..., N}. I think there's a shuffle method for arrays that will do that for you.


As requested, here's the code example:

function shuffle(array) {
  var top = array.length;
  while (top--) {
      var current = Math.floor(Math.random() * top);
      var tmp = array[current];
      array[current] = array[top - 1];
      array[top - 1] = tmp;
    }
  return array;
}

Upvotes: 3

JMax
JMax

Reputation: 26591

If i understand well, you want an array of integers but sorted randomly.

A way to do it is described here

First create a rand function :

function randOrd(){
return (Math.round(Math.random())-0.5); }

Then, randomize your array. The following example shows how:

anyArray = new Array('1','2','3','4','5');
anyArray.sort( randOrd );
document.write('Random : ' + anyArray + '<br />';);

Hope that will help,

Regards,

Max

Upvotes: 2

anthony sottile
anthony sottile

Reputation: 69964

Sometimes the best way to randomize something (say a card deck) is to not shuffle it before pulling it out, but to shuffle it as you pull it out.

Say you have:

var i,
    endNum = 51,
    array = new Array(52);
for(i = 0; i <= endNum; i++) {
    array[i] = i;
}

Then you can write a function like this:

function drawNumber() {
    // set index to draw from
    var swap,
        drawIndex = Math.floor(Math.random() * (endNum+ 1));

    // swap the values at the drawn index and at the "end" of the deck
    swap = array[drawIndex];
    array[drawIndex] = array[endNum];
    array[endNum] = swap;

    endNum--;
}

Since I decrement the end counter the drawn items will be "discarded" at the end of the stack and the randomize function will only treat the items from 0 to end as viable.

This is a common pattern I've used, I may have adopted it into js incorrectly since the last time I used it was for writing a simple card game in c#. In fact I just looked at it and I had int ____ instead of var ____ lol

Upvotes: 2

Related Questions