【问题标题】:Random lottery number generator随机彩票号码生成器
【发布时间】:2015-08-31 10:03:23
【问题描述】:

我要做的是为希腊彩票游戏 (Tzoker) 生成 6 个随机数,其中 5 个在 1-45 范围内,1 个在 1-25 范围内。前 5 个数字应该是唯一的。通过按下一个按钮,我想使用 jQuery 将这些数字添加到一个 div 中(这部分我有一些工作代码)。

我认为使用循环会很容易,但我发现自己无法检查生成的数字是否已经存在。循环只会包含前 5 个数字,因为最后一个数字可以等于其他 5 个数字之一

【问题讨论】:

    标签: javascript combinations


    【解决方案1】:

    让我建议你一些更简单的解决方案。

    1. 列出从 1 到 45 的所有数字。
    2. 使用Math.random(加减一些,read the docs of Array.sort 找出)作为比较函数对列表进行排序。您将获得随机顺序的列表。
    3. 从列表中取出前 5 项。
    4. 然后,当您已经有了数字时,将它们全部放入您的 div 中。

    这样您就不会将您的逻辑(获取数字)与您的演示文稿(将内容放入 DOM)混为一谈。

    我将实现留给读者作为练习。 :)

    【讨论】:

    • 不错的解决方案,但是如何提供 1-25 范围内的第六个数字?
    • 啊,我错过了这个。简单:Math.ceil(Math.random()*25).
    • 很好的解决方案!我在一个面试问题上问过这个问题。
    【解决方案2】:

    像这样?

    $(function() {
      $('button').on('click', function(e) {
        e.preventDefault();
        
        var numArray = [];
        
        while( numArray.length < 5 ) {
          var number = Math.floor((Math.random() * 45 ) + 1);
          if( $.inArray( number, numArray ) == -1 ) {
            numArray.push( number );
          }
        }
        numArray.push( Math.floor((Math.random() * 25 ) + 1) );
        $('div').html( numArray.join("<br />") );
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <button>Generate</button>
    <div></div>

    【讨论】:

    • “if(arrL == 5)”是否遵循另一种语法?
    • @kogigr 我误读了这个问题。我认为第六个数字也应该是唯一的。在代码中修复它:)
    【解决方案3】:

    虽然这可能不是您所要求的,但如果您使用lodash,这将很简单:

    _.sample(_.range(1, 46), 5) // the 5 numbers from 1..45
    _.random(1, 26)             // one more from 1..25
    

    这就是functional programming 如此酷的原因。您可以阅读例如Javascript Allonge 以了解更多信息。

    【讨论】:

    • 如果您编辑之前的答案并添加它会很好.. :)
    • 我是故意的,他们是不同的答案。虽然它的工作方式相似,但一种是命令式的,另一种是功能性的方法。此外,这个建议使用新的外部库,许多人会重新考虑。
    【解决方案4】:

    http://jsfiddle.net/015d05uu/

    var tzoker = $("#tzoker");
    var results = $("#results");
    tzoker.click(function() {
        results.empty();
        var properResults = [];
        var rand = 0;
        var contains = false;
        for (i = 1; i < 7; i++) {
            do 
            {
             (rand = Math.floor((Math.random() * (i != 6 ? 45 : 25)) + 1));
              contains = properResults.indexOf(rand) > -1;
            } while(contains)
            results.append("<br />", rand, "<br />");
            properResults.push(rand);
        }
    });
    

    这是解决方案的主要思想。您可以将最大值定义为随机数的参数。 然后,检查项目是否存在于一个仅包含您想要的数据的简单数组中。

    【讨论】:

      【解决方案5】:

      您可以使用通用函数生成从1maxValue 的随机数,并且仅当它们不存在时才将它们添加到数组中。然后,为了显示,循环遍历数组项并将它们附加到#randomNumbers

      HTML

      <div id="randomNumbers"></div>
      

      JS(使用 jQuery)

      var randomNumbersArray = [];
      
      $(function() {
          generateRandomNumbers();
          displayRandomNumbers();
      });
      
      function generateRandomNumbers() {
          for (i = 0; i < 5; i++) {
              generateRandomNumberFrom1To(45);
          }
          generateRandomNumberFrom1To(25);
      }
      
      function generateRandomNumberFrom1To(maxValue) {
          var randomNumber;
          do {
              randomNumber = Math.ceil(Math.random() * maxValue);
          } while ($.inArray(randomNumber, randomNumbersArray) > -1);
          randomNumbersArray.push(randomNumber);
      }
      
      function displayRandomNumbers() {
          for (i in randomNumbersArray) {
              $("#randomNumbers").append(randomNumbersArray[i] + "<br>");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-07-17
        • 2022-11-16
        • 1970-01-01
        • 2016-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 2015-01-14
        相关资源
        最近更新 更多