【问题标题】:Random number within range with no uniques (bingo) [duplicate]范围内的随机数,没有唯一性(宾果游戏)[重复]
【发布时间】:2018-04-22 14:02:01
【问题描述】:

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

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

我的问题是,每当遇到重复项时,它都会循环,直到找到唯一的数字,但显示该数字的次数与它在底行中循环的次数一样多。因此,如果我生成数字 [4, 6, 2] 然后生成另一个 4,它将继续循环,直到找到另一个不在数组中的数字。

如果它命中数组中的数字 2 次然后找到一个 5,它将显示为 [4, 6, 2, 5, 5, 5,]。有什么办法不让它显示前 2 个 5 吗?

window.onload = startup;

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

var number = 0;
var bingoNumber = [];
var i;

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


function clickME() {
  for (i = 0; i < bingoNumber.length; i++) {
    if (number === bingoNumber[i]) {
      newNumber1();
    }
  }
  bingoNumber.splice(0, 0, number);
  document.getElementById("display").innerHTML = bingoNumber[0];
  document.getElementById("row").innerHTML = bingoNumber;
}
<button type="button" id="button">Click</button>
<div id="display"></div>
<div id="row"></div>

【问题讨论】:

  • Java 不是 JavaScript - 只使用那些与您的问题真正相关的标签。
  • if (bingoNumber.indexOf(number)===-1) { not in array ... }if (bingoNumber.indexOf(number)!=-1) { in array ... } developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 用所有可能的数字填充数组。创建空数组,例如bingoNumber,选择一个有效的索引。将元素从大数组移动到bingoNumber,在大索引处拼接元素并重复

标签: javascript arrays random numbers


【解决方案1】:

您的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;
}

【讨论】:

    【解决方案2】:

    在真正找到唯一数字之前,不要将数字添加到数组中并显示内容:

    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;
        }
    }
    

    【讨论】:

    • 所以如果你在长度循环结束时没有找到唯一的数字,你必须再次点击?
    • 不,每次生成一个新数字,循环都会重新开始
    • 但是每次你循环并且没有找到一个数字时,你都在开始一个新的循环。这将在大量随机集下失控。每个匹配的数字都有自己的循环。
    【解决方案3】:

    这将为您提供所有数字而不会耗尽堆栈空间。最后有一个警报,让您知道所有号码都已被呼叫,并且还将隐藏该按钮,因此您无法再次单击它。那个你不需要的……但为什么不呢?

    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";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2011-08-02
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      相关资源
      最近更新 更多