3

I'm trying to make a bingo game for fun. I've looked in a lot of places for a unique generator but I can't seem to find one. I've tried to make my own,but once it actually hits a number that's the same it does an infinite loop. I've tried a simple code that in theory should work but for some reason things pass through. What can I do!?

var bc = [];
for (var i = 0; i < 5; i++) {
  var r = Math.floor(Math.random()*20+1) + 0;
  if(!(r in bc)){
    bc.push(r);     
    }
    else
    {
    i--;
    }
}
____________________________________________
____________________________________________
____________________________________________
b1=0;
b2=0;
b3=0;
b4=0;
b5=0;
var bc = [b1,b2,b3,b4,b5]
var bnc = function(){
    var n = Math.floor(Math.random() * 5+1)+0;
    var n2 = Math.floor(Math.random() * 5+1)+0;
    b1 = n;
    var a1 = true;
    var as = false;
    while(a1){
        var c = n;
        if(c===b1||c===0 ||as!==false){
        c = n2;
        as=true;
        }
        if(c===b1||c===0&&as===true){
        c = n;
        as=false;
        }
            if(c!=b1){
            b2 = c;
            a1 = false;
            a2 = true;
        }
    }
};
bnc();
console.log("new1");
console.log(b1,b2,b3,b4,b5);
//_______________________________________
var bnc2 = function(){
    var n = Math.floor(Math.random() * 5+1)+0;
    var n2 = Math.floor(Math.random() * 5+1)+0;
    var a1 = true;
    var as = false;
    while(a1){
        var c = n;
        if(c===b1||c===b2||c===0&&as===false){
        c = n2;
        as=true;
        }
        if(c===b1||c===b2||c===0&&as===true){
        c = n;
        as=false;
        }
        if(c!=b1&&c!=b2){
            b3 = c;
            console.log("made it 1");
            a1 = false;
        }
    }
};
bnc2();
console.log("new2");
console.log(b1,b2,b3,b4,b5);
4
  • It wouldn't be entirely wrong with some comments and/or description of what the functions is supposed to do since its so much code. You want to generate a sequence of unique random? It seems to be alot of code just for that... Commented Mar 23, 2013 at 8:18
  • You could easily adapt one of these answers if you need a unique random number: stackoverflow.com/questions/105034/… Commented Mar 23, 2013 at 8:20
  • Hint about your first for loop: the in operator doesn't do what you think it does (it tests property names, not property values). Commented Mar 23, 2013 at 8:29
  • Below link shows how to generate unique number with defined quantity of numbers. It is really simple logic at Javascript layer. blog.chrometaphore.com/2012/01/17/… Commented Jul 6, 2013 at 15:23

4 Answers 4

8

once it actually hits a number that's the same

It never should. Such algorithms take longer the longer they run. You should take a different approach:

Put all possible numbers into a pool. Once you draw a number, remove it from the pool. Just like it's done in real life.

var pool = [1, 2, 3, 4, 5];
var getNumber = function () {
    if (pool.length == 0) {
        throw "No numbers left";
    }
    var index = Math.floor(pool.length * Math.random());
    var drawn = pool.splice(index, 1);
    return drawn[0];
};
Sign up to request clarification or add additional context in comments.

Comments

3

I would rather do it with something like this:

http://jsfiddle.net/YC58s/

generate = function(length)
{
    var arr = [];
    var n;
    for(var i=0; i<length; i++)
    {
        do
            n = Math.floor(Math.random()*20+1);
        while(arr.indexOf(n) !== -1)

       arr[i] = n;
    }

    return arr;
}

2 Comments

Could you explain how this works. I get the loop, the return, the vars, but the while statement. How does that work, why does it not make repeats?
@TrentBraswell the while loop is a do/while. Which means it will run the inline statement and setting the n to a random number, before checking the criterium. The criterium evaluates if there is such a value in the array. indexOf(n) returns the integer key for the value of n if it exists in the array, otherwise it returns -1. Thus, running the loop again if indexOf does not return -1.
0

This can handle generating upto 20 digit UNIQUE random number

JS

var generatedNumbers = [];

function generateRandomNumber(precision) { // precision --> number precision in integer 
    if (precision <= 20) {
        var randomNum = Math.round(Math.random().toFixed(precision) * Math.pow(10, precision));
        if (generatedNumbers.indexOf(randomNum) > -1) {
            if (generatedNumbers.length == Math.pow(10, precision))
                return "Generated all values with this precision";
                return generateRandomNumber(precision);
        } else {
            generatedNumbers.push(randomNum);
            return randomNum;
        }
    } else
       return "Number Precision shoould not exceed 20";
}
generateRandomNumber(1);

enter image description here

JsFiddle

Comments

-1
window.onload = unRanNumGen(20, 1, 12);
    //above, we need 12 random numbers between 20 (included) and 1(included)

function unRanNumGen(max, min, limit){

    //max = maximum number [inclued] (range of numbers)
    //min = minimum number [included] (range of numbers)
    //limit = number of random numbers (how many numbers do you want?)

    var pool = [genRan(max, min)];

    for(i=0; i<limit; i++){
        for(n = 0; n <i; n++){

            if(pool[n] !== genRan(max, min)){
            pool.push(genRan(max, min));

            break;
            }
        }

    }

function genRan(max, min){
    var genRan = Math.floor(Math.random() * (max - min) + min);
    return genRan;
}

alert(pool.join('\n')); //to display the array of random numbers

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.