【问题标题】:Lottery with Supernumber超级号码彩票
【发布时间】:2017-07-26 15:10:50
【问题描述】:

我遇到了为彩票构建随机数生成器的挑战。
6 个数字,在 1 到 49 之间,按升序排列,没有一个看起来是两次。第一个7号,超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

这甚至是正确的结构吗?

提前致谢!

【问题讨论】:

  • 尽量保持一致。如果你使用const,也可以使用其余的 ES6 特性(let、箭头函数等)。

标签: javascript arrays for-loop random constants


【解决方案1】:

如果你找到一个有效数字,你可以创建一个无限循环并打破它:

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

【讨论】:

    【解决方案2】:

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

    如果 supNumb 未能通过“它必须是唯一的”标准,您还必须通过 Random 重新生成

    【讨论】:

      【解决方案3】:

      要对不重复的数字进行采样,有一种方法称为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];
      

      【讨论】:

        猜你喜欢
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        • 2016-02-04
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        相关资源
        最近更新 更多