Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 范围内无唯一性的随机数(宾果)_Javascript_Arrays_Random_Numbers - Fatal编程技术网

Javascript 范围内无唯一性的随机数(宾果)

Javascript 范围内无唯一性的随机数(宾果),javascript,arrays,random,numbers,Javascript,Arrays,Random,Numbers,我正在尝试创建一种宾果数字生成器,在其中生成一个唯一的数字并单独显示 我还希望该数字+我生成的所有下一个数字显示在一行的底部 我这里的问题是,每当它碰到一个重复的数字时,它就会循环,直到它找到一个唯一的数字,但显示该数字的次数与它在最下面一行循环的次数相同。因此,如果我生成数字[4,6,2],然后再生成另一个4,它将继续循环,直到找到另一个不在数组中的数字 如果它命中数组中的数字2次,然后找到一个5,它将显示为[4,6,2,5,5,5,]。我能做些什么不让它显示前25个吗 window.onl

我正在尝试创建一种宾果数字生成器,在其中生成一个唯一的数字并单独显示

我还希望该数字+我生成的所有下一个数字显示在一行的底部

我这里的问题是,每当它碰到一个重复的数字时,它就会循环,直到它找到一个唯一的数字,但显示该数字的次数与它在最下面一行循环的次数相同。因此,如果我生成数字[4,6,2],然后再生成另一个4,它将继续循环,直到找到另一个不在数组中的数字

如果它命中数组中的数字2次,然后找到一个5,它将显示为[4,6,2,5,5,5,]。我能做些什么不让它显示前25个吗

window.onload=启动; 功能启动{ document.getElementByIdbutton.onclick=newNumber1; } var数=0; var bingoNumber=[]; var i; 函数newNumber1{ 数字=Math.floorMath.random*9+1; 点击我; } 函数clickME{ 对于i=0;i在找到唯一编号之前,不要将编号添加到数组并显示内容:

var found;

function clickME() {

    found = true;
    for (i=0; i < bingoNumber.length; i++) {
        if (number === bingoNumber[i]){ 
            newNumber1();   
            found = false;
        }
    }
    if(found) {
        bingoNumber.splice(0, 0, number);
        document.getElementById("display").innerHTML = bingoNumber[0];
        document.getElementById("row").innerHTML = bingoNumber;
    }
}

这将为您提供所有数字,而不会耗尽堆栈空间。结尾处有一个警报,让您知道所有号码都已拨打,并且还将隐藏按钮,以便您不能再次单击它。那个你不需要的…但为什么不呢

window.onload = startup;

var bingoNumber = [];

function startup(){ 
    document.getElementById("button").onclick = newNumber1;
}

function newNumber1() {
    clickME(Math.floor((Math.random() * 9) + 1));
}


function clickME(num) {  
    if(bingoNumber.length < 9){
        if (bingoNumber.indexOf(num) !== -1){ 
            newNumber1();   
        }else{
            bingoNumber.splice(0, 0, num);
            document.getElementById("display").innerHTML = bingoNumber[0];
            document.getElementById("row").innerHTML = bingoNumber;
        }
    }else{
        alert("All numbers have been picked");
        document.getElementById("button").style.visibility = "hidden";
    }
}
您的clickMe在newNumber1完成执行之前调用它,这不是问题所在。问题是newNumber1调用clickMe的另一个实例,循环继续。因此,在newNumber1生成唯一编号时,clickMe的当前和以前的实例每次都会插入相同的新编号

另一个问题是,即使你能做到这一点,如果bingoNumber包含newNumber1可以生成的所有可能的唯一数字,clickMe中的循环也会继续

试试这个:

window.onload = startup;

var bingoNumber = []; // contains all generated numbers

function startup(){ 
    document.getElementById("button").onclick = clickMe;
}

function newNumber(){
    // generate a new number
    return Math.floor((Math.random() * 9) + 1);
}

function clickMe(){

    // if bingoNumber contains all possible values, don't run the rest
    // change this to however you want to terminate it
    if(bingoNumber.length==9){ return false; }

    var num; // number to add to the array

    // generate a new number until it is unique
    for(num=newNumber();bingoNumber.indexOf(num)>=0;num=newNumber());

    // add the unique number in the beginning of the array
    bingoNumber.unshift(num);

    // display last generated value
    document.getElementById("display").innerHTML = bingoNumber[0];

    // display all generated value
    document.getElementById("row").innerHTML = bingoNumber;
}

Java不是JavaScript-只使用与您的问题真正相关的标记。如果bingoNumber.indexOfnumber===-1{不在数组中…}或者如果bingoNumber.indexOfnumber=-1{在数组中…}用所有可能的数字填充数组。创建空数组,例如bingoNumber,选择有效索引。将元素从大数组移动到bingoNumber,在大索引处拼接元素并重复。因此,如果在长度循环结束时未找到唯一的数字,则必须再次单击?不,每次它生成一个新数字时,循环都会重新开始。但是,每次循环且未找到数字时,您都会开始一个新循环。这将失去控制与一个大的随机集。每个匹配的数字都有自己的循环。