超级号码

时间:2017-07-26 15:10:51

标签: javascript arrays for-loop random const

我遇到了为彩票建立随机数发生器的挑战 6个数字,在1到49之间,没有一个看起来是两次,按升序排列。一个第7个数字,超七,未分类,不能是以前的数字之一。

<script type="text/javascript">
    const numb = new Array();
    for (var i = 0; i < 6; i++) {
        numb[i] = Math.floor(49 * Math.random()) + 1;

        //compare to existing numbs
        for (var k = 0; k < numb.length - 1; k++) {
            if (numb[i] == numb[k]) {
                i--;
                break;
            }
        }
    }

    let supNumb = new Array();
    supNumb = Math.floor(49 * Math.random()) + 1;
    for (var s = 0; s <= 1; s++) {
        // compare supNumb to numb
        for (var t = 0; t < numb.length - 1; t++) {
            if (supNumb == numb[t]) {
                s--;
                break;
            }
        }
    }


    // SORT & DISPLAY NUMBERS 
    function sort(a, b) {
        return a - b;
    }

    numb.sort(sort);
    document.write("<p> " + numb);
    document.write("<h4>" + "SuperSeven: " + supNumb);
</script>

我知道通过尝试超级七supNumb仍然提供与numb相同的数字。
我无法让它工作,无法找到任何提到的地方。

此处有人可以查看并告诉我如何将supNumbnumb进行比较?

这甚至是正确的结构吗?

提前致谢!

3 个答案:

答案 0 :(得分:0)

如果找到如此有效的数字,你可以制作一个无限循环并打破它:

while(true){
    supNumb = Math.floor(49 * Math.random()) + 1;
    if(numb.indexOf(supNumb) < 0){
        break;
    }
}

还可以更好地使用indexOf,以便在数组中进行搜索。它比普通的JS快得多。 https://www.w3schools.com/jsref/jsref_indexof_array.asp

您甚至可以使用Set机制来实现这一目标。集只能存储唯一值。因此将忽略所有重复项:

var numbers = new Set(),
    supNumb = 0;
while(numbers.size < 6){
    numbers.add(Math.floor(49 * Math.random()) + 1);
}
while(true){
    supNumb = Math.floor(49 * Math.random()) + 1;
    if(!numbers.has(supNumb)) break;
}
var sortedNumbers = [...numbers].sort((a,b)=>{return a-b})
console.log(sortedNumbers, supNumb);

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Set

答案 1 :(得分:0)

你有supNumb作为一个数组,我认为它应该是一个标量(单个整数),因为你正在对数组numb的数组成员进行比较

如果supNumb无法通过他的标准'它必须是唯一',你必须通过随机重新生成

答案 2 :(得分:0)

为了对非重复数字进行采样,有一种名为Fisher-Yates-Knuth shuffle的方法。保证从1 ... 49范围内选择7个非重复数字,无需任何二次检查。

在某些伪代码中(抱歉,不知道Javascript)

a = _.range(1, 50);

for i from n−1 downto 1 do
     j ← random integer such that 0 ≤ j ≤ i
     exchange a[j] and a[i]

sort(a, 6); // sort first 6 elements
super = a[6];