【问题标题】:I need another way to code this using arrays and a random generator我需要另一种方法来使用数组和随机生成器对此进行编码
【发布时间】:2017-07-28 08:28:04
【问题描述】:

这段代码的目的是创建一个随机选择的一百个块对象的数组,但我不确定这段代码是否有效

    var array_result = ();

    for( let i= 0; i<100; i++){
      var number=  parseInt (7* Math.Random());
      switch (number) {
        case 0:
          array_result.push (new Dirt ());
          break;
        case 1:
          array_result.push (new CobbleStone ());
          break;
        case 2:
          array_result.push (new sand ());
          break;
        case 3:
          array_result.push (new IronOre ());
          break;
        case 4:
          array_result.push (new Gravel ());
          break;
        case 5:
          array_result.push (new Coal ());
          break;
        case 6:
          array_result.push (new RedStone ());
          break;
        case 7:
          array_result.push (new CraftingTable ());
          break;
      }
    }

    console.log(array_result)

【问题讨论】:

标签: javascript html css arrays random


【解决方案1】:

在 Javascript 中,使用 Math.random() 而不是 Math.Random()

您的parseInt 调用应该包含 10 的基数。在这种情况下您不会遇到任何意外结果,因为您只有 8 个块对象,但最好还是指定它(否则 parseInt 可能会尝试解析该值是八进制而不是十进制值。)

你的代码永远不会产生 case 7,因为Math.random 产生的数字范围是 0(包括)到 1(不包括)。

要解决这些问题,请更改:

var number = parseInt(7* Math.Random());

var number = parseInt(8 * Math.random(), 10);

另外:

要定义数组,请使用方括号代替圆括号:

var array_result = [];

【讨论】:

    【解决方案2】:

    首先,您的间隔永远不会达到 7,因为 random() 给出的结果介于 parseInt() 解析一个字符串并返回第一个数字整数,所以我认为最好使用不同的东西。

    试试这个:

    //random number in closed interval (includes its endpoints)
    function getRndInteger(min, max) {
      return Math.floor(Math.random() * (max - min)) + min;
    }
    
    var number = getRndInteger(0, 7);
    

    【讨论】:

      【解决方案3】:

      以下是我看到的问题:

      1. var array_result = ();改为

        var array_result = [];

      2. Math.random() 返回 0 到 1 之间的整数。使用您拥有的代码,获取 case 7 的唯一方法是 math.random 返回 1。这是因为 parseInt(6.99999) 将返回 6。更改为

        var number= parseInt(8 * Math.Random());

      3. 使用 math.random() ,不要大写 R

      【讨论】:

        【解决方案4】:

        一种更具声明性的方法:

        const factories = [
            () => new Dirt(),
            () => new Cobblestone(),
            () => new Sand(),
            () => new IronOre(),
            () => new Gravel(),
            () => new Coal(),
            () => new RedStone(),
            () => new CraftingTable()
        ];
        
        const getRandomNumber = ( maxNumber ) => parseInt(maxNumber * Math.random(), 10);
        
        const getRandomFromArray = ( items ) => items[getRandomNumber(items.length)];
        
        const getSomeItems = ( howMany, factories ) => new Array(howMany).map(() => getRandomFromArray(factories)());   
        
        const array_result = getSomeItems(100, factories));
        

        【讨论】:

          【解决方案5】:

          这是一种无需开关即可打开数字的简洁方式,给定 1 个输入和 1 个输出:

          function createObject(typeId) {
              return new [ 
                  Dirt, CobbleStone, Sand, IronOre, Gravel, Coal, RedStone, CraftingTable
              ][typeId] || Error;
          }
          

          您甚至可以在外部定义/修改数组以实时编辑分配,这对于 switch 来说简直是天方夜谭。它也比 switch 更快,因为它在找到匹配项之前不会评估每个条件:它直接跳转到正确的插槽并在该插槽中实例化一个由构造函数命名的类型的新对象。

          抛开性能不谈,我喜欢这种模式,因为它干净、易读且易于维护。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-20
            • 1970-01-01
            • 2012-07-25
            • 2015-03-14
            • 1970-01-01
            • 2022-01-05
            • 2013-08-23
            • 2015-01-25
            相关资源
            最近更新 更多