【问题标题】:Create a function that returns unique random numbers and assigns that number to an individual variable创建一个返回唯一随机数并将该数字分配给单个变量的函数
【发布时间】:2020-02-10 02:41:49
【问题描述】:

我刚刚开始编程并遇到了这个问题。论坛上发布的答案并没有真正帮助我,所以这是我的问题。 我正在尝试创建一个生成 1-12 之间的四个随机数的函数。生成数字后,将它们分配给单个变量。

var gem1;
var gem2;
var gem3;
var gem4;

function updateGem() {
    gem1 = Math.floor(Math.random() * 12 + 1);
    gem2 = Math.floor(Math.random() * 12 + 1);
    gem3 = Math.floor(Math.random() * 12 + 1);
    gem4 = Math.floor(Math.random() * 12 + 1);
}

正如您所看到的,有时生成的数字是匹配的,这不是我需要的。我需要每个 var 都有自己的唯一编号。

The value of gem 1 is 8
The value of gem 2 is 9
The value of gem 3 is 9
The value of gem 4 is 8

【问题讨论】:

  • 这是随机的点。也许尝试更高的边界减少碰撞的机会或存储数字并与之前生成的数字进行比较,或者生成一个数字并增加下一个 3
  • 你可以创建一个从 1 到 12 的数组。然后打乱这个数组,并抓取前四个元素。这样,您可以获得一个由 4 个唯一随机数组成的数组,范围从 1 到 12
  • 感谢@NickParsons 成功了!

标签: javascript function variables random


【解决方案1】:

你可以这样做:

function generateRandomUnique(size) {
  const unique = new Set();
  while (unique.size < size)  {
    unique.add(Math.floor(Math.random() * 12 + 1));
  }
  return [...unique];
}

const [gem1, gem2, gem3, gem4] = generateRandomUnique(4);
console.log(gem1, gem2, gem3, gem4);

【讨论】:

    【解决方案2】:

    将变量存储在数组中并检查数组中的数字

    var gem1;
    var gem2;
    var gem3;
    var gem4;
    var arr=[];
    function updateGem() {
    arr=[];
        gem1 = Math.floor(Math.random() * 12 + 1);
        if(arr.includes(gem1))
        updateGem();
        else
        arr.push(gem1);
        gem2 = Math.floor(Math.random() * 12 + 1);
        if(arr.includes(gem2))
        updateGem();
        else
        arr.push(gem2);
        gem3 = Math.floor(Math.random() * 12 + 1);
        if(arr.includes(gem3))
        updateGem();
        else
        arr.push(gem3);
        gem4 = Math.floor(Math.random() * 12 + 1);
        if(arr.includes(gem4))
        updateGem();
        else
        arr.push(gem4);
        
    }
    updateGem()
    console.log(gem1)
    console.log(gem2)
    console.log(gem3)
    console.log(gem4)

    【讨论】:

    • 这需要多少次迭代?即使随机选择 3 个数字作为第 4 个数字,它也必须再次生成 3。我认为它效率不高
    • 我很清楚。 n 次无限迭代
    • 如果你的机器心情不好,那么它会永远持续下去?
    【解决方案3】:

    这是我为解决问题所做的:

    function updateGem() {
        var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
        numbers.sort(() => {
            return 0.5 - Math.random();
        });
    
        gem1 = numbers[0];
        gem2 = numbers[1];
        gem3 = numbers[2];
        gem4 = numbers[3];
    
    }
    

    【讨论】:

    【解决方案4】:

    根据数组长度生成一个随机数。与最后一个索引交换,现在再次生成一个基于数组长度减 1 的数字。

    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    var count = numbers.length;
    function updateGem() {
    
        gem1 = getRandomNumber();
        gem2 = getRandomNumber();
        gem3 = getRandomNumber();
        gem4 = getRandomNumber();
    
        console.log(gem1, gem2, gem3, gem4);
    
    }
    function getRandomNumber() {
    
        if (count <= 0) {
            count = numbers.length;
        }
        var randomIndex = Math.round(count * Math.random());
        console.log("Random Number="+randomIndex);
        var temp = numbers[randomIndex]; 
        numbers[randomIndex] = numbers[count-1];
        numbers[count-1] = temp;
        count--; // next time do not generate this random number
        return temp;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2021-01-21
      • 1970-01-01
      • 2018-10-29
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多