【问题标题】:javascript: generate 2 random but distinct numbers from rangejavascript:从范围内生成2个随机但不同的数字
【发布时间】:2011-02-09 14:53:14
【问题描述】:

快速提问:

实现这行python代码的最佳方法是什么(从给定范围生成两个随机但不同的数字)...

random.sample(xrange(10), 2)

...在 Javascript 中?

提前致谢!

马丁

【问题讨论】:

    标签: javascript random sampling


    【解决方案1】:

    这是我使用拼接的尝试:

    var a = [1,2,3,4,5,6,7,8,9,10];var sample = [];
    sample.push(a.splice(Math.random()*a.length,1));
    sample.push(a.splice(Math.random()*a.length,1));
    

    封装在一个函数中:

    function sample_range(range, n) {
      var sample = [];
      for(var i=0; i<n; i++) {
        sample.push(range.splice(Math.random()*range.length,1));
      }
    
      return sample;
    }
    
    var sample = sample_range([1,2,3,4,5,6,7,8,9,10], 2);
    

    我们还可以将函数粘贴到 Array.prototype 中,使其具有类似点符号的语法:

    Array.prototype.sample_range = function(n) {
        var sample = [];
        for(var i=0;i<n;i++) {
          sample.push(this.splice(Math.random()*this.length,1));
        }
        return sample;
    };
    var sample = [1,2,3,4,5,6,7,8,9,10].sample_range(2);
    

    【讨论】:

    • 在这个 O(n*range) 上的性能。我不建议使用它。如果你假设范围数组已经创建,你最好运行 n 次 Knuth shuffle 迭代,这将是 O(n),否则为 O(n+range)。
    【解决方案2】:

    如果要生成 0 和 n 之间的随机数,一种方法是在 0..n 中随机选择数字 r1,然后从 0..n-1 中选择 r2,如果 @987654327,则在 r2 中加 1 @。

    【讨论】:

      【解决方案3】:
      function sample(range,tot){
          if(tot > range){
              alert('infinite loop?');
              return [];
          }
          var myRandomNumbers = [];
          for(var i = 0; i<tot; i++){
              var randN = Math.floor(Math.random()*range);
              while(myRandomNumbers.contains(randN)){
                  randN = Math.floor(Math.random()*range);
              }
              myRandomNumbers.push(randN);
          }
          return myRandomNumbers
      }
      
      var nums = sample(10,2); //array containing 2 distinct random numbers
      

      【讨论】:

        【解决方案4】:

        生成一个,然后重复生成第二个,直到它与第一个不同。它需要运行更长时间的可能性很小,但除非您需要生成数十亿个数字,否则您不会看到任何性能下降。

        【讨论】:

          猜你喜欢
          • 2023-01-08
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          • 2013-10-27
          • 2013-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多