乐透发电机javascript

时间:2015-11-01 22:37:15

标签: javascript random

Hallo by lotto generator code我在一个“生成”周期中得到了一些数字。这是代码:

function lottery() {
    for (var i=0; i<=7; i++) {
        var lottery = Math.floor(Math.random() * 49);
        document.getElementById ("lotto" + i).innerHTML = lottery;
    }
}

谁知道问题出在哪里?谢谢!

4 个答案:

答案 0 :(得分:2)

只是为了好玩:O(N)解决方案(其他帖子为O(N^2)

它使用Fisher-Yates shuffle algorithm,然后在第一个7元素被洗牌后,它们按原样使用。

因此,无需检查是否已绘制任何数字:

const arr = Array(50).fill(0).map((_, i) => i);
const DRAW = 7;

const rand = (from, to) => Math.floor(Math.random() * (to - from + 1)) + from;

for (let i = 0; i < DRAW; ++i) {
  const r = rand(i, arr.length - 1);
  [arr[r], arr[i]] = [arr[i], arr[r]];
}

const selected = arr.slice(0, DRAW);

参考文献:

答案 1 :(得分:1)

与@JNK评论一样,您需要存储使用过的值以避免再次使用它们。

最简单的方法是将它们存储在数组中,并检查它们是否已被使用。

function lottery() {
    var used = [];
    for (var i=0; i<=7; i++) {

        var lottery;
        while(true) { // this loop keeps going until a new number is found
            lottery = Math.floor(Math.random() * 49);
            var newNum = true;
            for(var j=0; j<used.length; j++) {
                if(used[j] == lottery) { 
                    newNum = false;  // if already used, set newNum to false
                    break;
                }
            }
            if(newNum) { // if not already used, then add num to used array
                used.push(lottery);
                break;
            }
        }

        document.getElementById ("lotto" + i).innerHTML = lottery;
    }
}

答案 2 :(得分:1)

从他的链接到JNK的所有信用。这不是很直观(它被最小化,就像在代码高尔夫中一样),但它是一个有趣的解决方案。

优化的随机数生成器(86字节):

var getRandomLottoNumbers = function () { 
    var n=[],i=0;
    for(;++i<50;)
        n.push(i);
    for(;--i>6;)
        n.splice(i*Math.random()|0,1);
    return n
};

完整解释here

答案 3 :(得分:0)

与其他方法类似,但只使用一个循环。

function lottery() {
  var winners = [];
  while (winners.length < 7) {
    var lottery = Math.floor(Math.random() * 49);
    if (winners.indexOf(lottery) === -1) {
      winners.push(lottery);
      document.getElementById ("lotto" + winners.length).innerHTML = lottery;
    }
  }
}