代码之家  ›  专栏  ›  技术社区  ›  Devmix

如何得到两个彼此可除的随机数?

  •  -2
  • Devmix  · 技术社区  · 6 年前

    我生成两个随机数:

    1) 第一个数字必须是从1到30的随机数

    我只是想让第一个数可以被第二个数整除,反之亦然,最后,提醒结果。我的问题是如何得到两个随机数的除法结果?有人能指点我正确的方向吗?提前多谢!.

    第一个数字必须可以被第二个数字整除。

    这是我的代码:

    var arr = [];
    for (var i = 0; i < 2; i++) {
        do {
        var firstRandomNumber = Math.floor(Math.random()*30) + 1;
        var secondRandomNumber = Math.floor(Math.random()*10) + 1;
        if(firstRandomNumber % secondRandomNumber === 0){
            correctResult = result;
            arr.push(correctResult);
        }
        } while ((firstRandomNumber % secondRandomNumber === 0));
      }
      console.log(arr);
    
    5 回复  |  直到 6 年前
        1
  •  1
  •   Blue    6 年前

    几件事:

    • 你的 while 循环应该循环到 firstRandomNumber % secondRandomNumber === 0
    • result 没有设置任何位置,因此我将结果添加到数组中
    • 这个 if(firstRandomNumber % secondRandomNumber === 0){ 是多余的。当do/while循环完成时,它将拥有匹配的do编号。只需移动 arr.push() 在那个圈子之外。

    var arr = [];
    for (var i = 0; i < 2; i++) {
      do {
        var firstRandomNumber = Math.floor(Math.random()*30) + 1;
        var secondRandomNumber = Math.floor(Math.random()*10) + 1;
      } while ((firstRandomNumber % secondRandomNumber !== 0));
    
      console.log('first', firstRandomNumber, 'second', secondRandomNumber);
      arr.push(firstRandomNumber / secondRandomNumber);
    }
    console.log(arr);
        2
  •  2
  •   CertainPerformance    6 年前

    我建议一种更实用的方法:创建一个创建两个随机数的函数,如果一个可以被另一个整除,则返回它们。然后,只要调用该函数,直到得到一个真实的结果:

    function tryGetDivisible() {
      var firstRandomNumber = Math.floor(Math.random() * 30) + 1;
      var secondRandomNumber = Math.floor(Math.random() * 10) + 1;
      if (firstRandomNumber % secondRandomNumber === 0) {
        console.log(firstRandomNumber, secondRandomNumber);
        return firstRandomNumber / secondRandomNumber;
      }
    }
    
    let result;
    while (!result) result = tryGetDivisible();
    const arr = [result];
    console.log(arr);
        3
  •  0
  •   HessamSH    6 年前

    一个更简单的方法是得到第一个随机数,然后尝试得到第二个随机数,直到它们是可除的。下面是代码:

        var firstRandomNumber = Math.floor(Math.random()*30) + 1;
        while (firstRandomNumber % secondRandomNumber !== 0) {
            var secondRandomNumber = Math.floor(Math.random()*10) + 1;
        }
      console.log(firstRandomNumber + "," + secondRandomNumber);
    
        4
  •  0
  •   Ted Hopp    6 年前

    1. 生成第二个数字。
    2. 确定不超过30的第二个数的最大倍数(例如, Math.floor(30/firstNumber) ).
    3. 随机选择一个倍数作为第一个数字。您只需选择一个介于1和最大允许乘数(包括)之间的随机数。

    这样,就不需要执行generate和test循环,在成功生成一对之前,循环可能会进行无限次。

        5
  •  0
  •   Mark    6 年前

    如果你想避免 while 循环,您可以选择第一个数字,然后在数组中组合可能的第二个数字。然后随机选择其中一个:

    let first = Math.floor(Math.random() * 10) + 1
    
    // all possible divisible numbers
    let factors = Array.from({length: 30}, (_, i) => i + 1)
        .filter(i => first % i === 0 || i % first === 0)
    
    //pick one
    let second = factors[Math.floor(Math.random() * factors.length)]
    
    console.log(first, second)