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;
}
}
谁知道问题出在哪里?谢谢!
答案 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;
}
}
}