【问题标题】:How can i make two random numbers keep a certain distance away from each other?如何让两个随机数彼此保持一定距离?
【发布时间】:2017-07-06 12:35:20
【问题描述】:

我是 javascript 编程的新手,但我知道我的代码有多么混乱,所以我很抱歉。我想做的是创建 2 个(目前,最终版本将有很多)“树”,它们现在只是矩形,放置在随机 x 值上。但我不希望它们彼此相距 40 像素以内。我一直在尝试写一些应该实现这一目标的东西,但我不知道为什么它不起作用,树木仍然在彼此之上产卵!这让我疯狂。顺便说一句,我正在使用 p5js 和 sublime text 2。

function bg(){
    var tree = Math.floor(Math.random() * (380 - 0) + 00);
    var tree2 = Math.floor(Math.random() * (380 - 0) + 0);
    redefine(tree,tree2);
    this.x=0;

    this.show = function(){
        noStroke();

        //tree
        fill(102, 51, 0);
        rect(this.x+tree , 450, 26, 110);

        //tree2
        fill(102, 51, 0);
        rect(this.x+tree2, 410, 26, 150);   
    }
}

function redefine(first, second){
    if(second<=first-40 || second>=first+40){
        console.log("good");
    } else {
        console.log("redefining")
        second = Math.floor(Math.random() * (380 - 0) + 0);
    }
}

//key
// Math.random() * (max - min) + min    

【问题讨论】:

  • 你可以创建一个 sn-p 吗?
  • @DeepakSharma 对不起,sn-p 是什么?
  • 就像 stackoverflow 中的 jsfiddle。所以我们可以在这里运行测试代码
  • @DeepakSharma 我将如何处理多个 js 文件?

标签: javascript random numbers


【解决方案1】:

一个问题是你只给你的redefine 函数一个机会来滚动另一个随机数。您可以将其更改为一个循环,不断尝试直到它们之间的距离合适。

【讨论】:

    【解决方案2】:

    在重新定义中,您尝试更改“second”的值,但这不会修改“tree2”,因为它是本地范围的原始变量。假设你的其他逻辑是合理的,这样的事情可能会起作用:

    function bg(){
    
    
    var tree = Math.floor(Math.random() * (380 - 0) + 00);
    var tree2 = Math.floor(Math.random() * (380 - 0) + 0);
    
    while(isOverlapping(tree, tree2)) {
        tree2 = Math.floor(Math.random() * (380 - 0) + 0);
    }
    
    this.x=0;
    
    this.show = function(){
    noStroke();
    
    //tree
    fill(102, 51, 0);
    rect(this.x+tree , 450, 26, 110);
    
    //tree2
    fill(102, 51, 0);
    rect(this.x+tree2, 410, 26, 150);   
        }
    }
    
    function isOverlapping(first, second){
        if(second<=first-40 || second>=first+40){
            console.log("good");
            return false;
        } else {
            console.log("redefining")
            return true;
        }
    }
    

    【讨论】:

      【解决方案3】:

      我建议使用“定义”方法而不是“重新定义”:

      function bg() { 
      
          var tries   =   define(tree, tree2);
          var tree    =   tries[0];
          var tree2   =   tries[1];   
      
      
          this.x = 0;
      
          this.show = function () {
          noStroke();
      
          //tree
          fill(102, 51, 0);
          rect(this.x + tree, 450, 26, 110);
      
          //tree2
          fill(102, 51, 0);
          rect(this.x + tree2, 410, 26, 150);
          }
      
      }
      
      function define() {
      
          var tries       =   [];
              tries[0]    =   0;
              tries[1]    =   0;
          var i           =   0;
      
          while(tries[1] - tries[0] <=  40 && tries[0] - tries[1] <=  40){
      
              tries[0]    = Math.floor(Math.random() * (380 - 0) + 0);
              tries[1]    = Math.floor(Math.random() * (380 - 0) + 0);        
              i++;
              console.info('iter:',i,' inside tree:',tries[0],' tree2:',tries[1]);
      
          }
      
          return tries;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-22
        相关资源
        最近更新 更多