【问题标题】:Unique Random Number Generator Javascript唯一随机数生成器 Javascript
【发布时间】:2013-03-13 03:47:39
【问题描述】:

我正在尝试制作一款有趣的宾果游戏。我在很多地方都找了一个独特的发电机,但我似乎找不到。我试着自己做,但是一旦它实际上达到了一个相同的数字,它就会无限循环。我尝试了一个简单的代码,理论上应该可以工作,但由于某种原因,事情通过了。我该怎么办!?

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

【问题讨论】:

  • 一些 cmets 和/或对函数应该做什么的描述不会完全错误,因为它有这么多代码。你想生成一个独特的随机序列吗?似乎有很多代码只是为了……
  • 如果您需要一个唯一的随机数,您可以轻松调整以下答案之一:stackoverflow.com/questions/105034/…
  • 提示您的第一个 for 循环:in 运算符没有按照您的想法执行(它测试属性名称,而不是属性值)。
  • 下面的链接显示了如何生成具有定义数量的号码的唯一号码。 Javascript 层的逻辑非常简单。 blog.chrometaphore.com/2012/01/17/…

标签: javascript random generator


【解决方案1】:

一旦它实际命中一个相同的数字

它永远不应该。这样的算法take longer the longer they run。你应该采取不同的方法:

将所有可能的数字放入一个池中。抽到号码后,将其从池中取出。就像在现实生活中一样。

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

【讨论】:

    【解决方案2】:

    我宁愿这样做:

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

    【讨论】:

    • 您能解释一下这是如何工作的吗?我得到了循环、返回、变量,但还有 while 语句。这是如何工作的,为什么不重复?
    • @TrentBraswell while 循环是一个 do/while。这意味着它将运行内联语句并将 n 设置为随机数,然后再检查标准。标准评估数组中是否存在这样的值。 indexOf(n) 如果 n 的值存在于数组中,则返回其值的整数键,否则返回 -1。因此,如果 indexOf 不返回 -1,则再次运行循环。
    【解决方案3】:

    这可以处理生成多达 20 位的唯一随机数

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

    JsFiddle

    【讨论】:

      【解决方案4】:
      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
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-05-03
        • 1970-01-01
        • 2019-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多