【问题标题】:generate 4 digit random number using substring使用子字符串生成 4 位随机数
【发布时间】:2022-04-26 15:44:29
【问题描述】:

我正在尝试执行以下代码:

var a = Math.floor(100000 + Math.random() * 900000);
a = a.substring(-2);

我在第 2 行收到类似 undefined is not a function 的错误,但是当我尝试执行 alert(a) 时,它有一些东西。这里有什么问题?

【问题讨论】:

  • alert(a) 有什么?
  • Math.floor 返回一个数字。数字没有substring 方法。

标签: javascript jquery


【解决方案1】:

那是因为a 是一个数字,而不是一个字符串。你可能想要做的是这样的:

var val = Math.floor(1000 + Math.random() * 9000);
console.log(val);
  • Math.random() 将在 [0, 1) 范围内生成一个浮点数(这不是拼写错误,它是标准的数学符号,表明 1 被排除在范围之外)。
  • 乘以 9000 得到范围为 [0, 9000)。
  • 添加 1000 会导致范围为 [1000, 10000)。
  • Flooring 去掉了十进制值,给你一个整数。请注意,它不是圆的。

一般情况

如果要生成[x,y)范围内的整数,可以使用以下代码:

Math.floor(x + (y - x) * Math.random());

【讨论】:

  • 无法重新生成以零开头的代码,例如0123
  • @5ervant,这将是一个 3 位数字。 (数学上,前导 0 无关紧要。)
【解决方案2】:

这将使用子字符串生成 4 位随机数 (0000-9999):

var seq = (Math.floor(Math.random() * 10000) + 10000).toString().substring(1);
console.log(seq);

【讨论】:

    【解决方案3】:

    我对 Balajis 进行了改编,使其具有不可变性和功能性。

    因为这不使用数学,所以您可以使用字母数字、表情符号、很长的大头针等

    const getRandomPin = (chars, len)=>[...Array(len)].map(
       (i)=>chars[Math.floor(Math.random()*chars.length)]
    ).join('');
    
    
    //use it like this
    getRandomPin('0123456789',4);
    

    【讨论】:

      【解决方案4】:

      $( document ).ready(function() {
        
          var a = Math.floor(100000 + Math.random() * 900000);   
          a = String(a);
          a = a.substring(0,4);
          alert( "valor:" +a );
        
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

      【讨论】:

      • 必须记住,当您执行数学逻辑时,您可能会收到 int 或 double 的数据类型,因此您必须将结果转换为字符串以由 substring 函数处理,希望这个帮助
      • 这与 erkaner 的解决方案有何不同? $(document).ready 调用在这里是不必要的。
      • 如果你在 jquery 代码中使用它,但你是对的,否则是不必要的
      【解决方案5】:

      您的a 是一个数字。要能够使用substring 功能,它必须是string 首先,尝试

      var a = (Math.floor(100000 + Math.random() * 900000)).toString();
      a = a.substring(-2);
      

      【讨论】:

      • 这会生成一个 6 位而不是 4 位的数字。
      • 它也不会创建一个数字而是一个字符串。
      【解决方案6】:

      您可以通过这种方式获得 4 位数 .substring(startIndex, length),在您的情况下是 .substring(0, 4)。为了能够使用.substring(),您需要使用.toString()a 转换为字符串。最后,您可以使用parseInt 将结果输出转换为整数:

       var a = Math.floor(100000 + Math.random() * 900000)
       a = a.toString().substring(0, 4);
      
       a =  parseInt(a);
      
       alert(a);
      

      https://jsfiddle.net/v7dswkjf/

      【讨论】:

        【解决方案7】:

        问题在于a 是一个数字。您不能将substring 应用于数字,因此您必须将数字转换为字符串,然后再应用该函数。

        演示:https://jsfiddle.net/L0dba54m/

        var a = Math.floor(100000 + Math.random() * 900000);
        a = a.toString();
        a = a.substring(-2);
        

        【讨论】:

        • 您的演示清楚地表明您的解决方案产生了一个长度为 6 的字符串。
        • 是的,这就是我想要做的事情
        • 好吧,OP想要创建一个4位数字。
        【解决方案8】:
        $(document).ready(function() {
          var a = Math.floor((Math.random() * 9999) + 999);
          a = String(a);
          a = a.substring(0, 4);
        });
        

        【讨论】:

          【解决方案9】:
          // It Will Generate Random 5 digit Number & Char 
          const char = '1234567890abcdefghijklmnopqrstuvwxyz'; //Random Generate Every Time From This Given Char
          const length = 5;
          let randomvalue = '';
          for ( let i = 0; i < length; i++) {
          
              const value = Math.floor(Math.random() * char.length);
          
              randomvalue += char.substring(value, value + 1).toUpperCase();
          
          }
          
          console.log(randomvalue);
          

          【讨论】:

          • 它将从长度为 5 的 char 变量生成随机值,并在循环中检查长度并从 char 变量生成随机 5 位值并将其转换为大写
          【解决方案10】:
              function getPin() {
              let pin = Math.round(Math.random() * 10000);
              let pinStr = pin + '';
          
              // make sure that number is 4 digit
              if (pinStr.length == 4) {
                  return pinStr;
                 } else {
                  return getPin();
                 }
              }
          
             let number = getPin();
          

          【讨论】:

            【解决方案11】:

            只需将 Length of 传递给需要生成的数字

              await this.randomInteger(4);
              async randomInteger(number) {
            
                let length = parseInt(number);
                let string:string = number.toString();
                let min = 1* parseInt( string.padEnd(length,"0") ) ;
                let max =   parseInt( string.padEnd(length,"9") );
            
                return Math.floor(
                  Math.random() * (max - min + 1) + min
                )
              }
            

            【讨论】:

              【解决方案12】:

              这很简单

              const arr = ["one", "Two", "Three"]
              const randomNum = arr[Math.floor(Math.random() * arr.length)];
              

              【讨论】:

                【解决方案13】:
                export const createOtp = (): number => {
                      Number(Math.floor(1000 + Math.random() * 9000).toString());
                }
                

                【讨论】:

                • A code-only answer is not high quality。虽然此代码可能很有用,但您可以通过说明其工作原理、工作方式、何时应该使用以及它的局限性来改进它。请edit您的回答包括解释和相关文档的链接。
                猜你喜欢
                • 1970-01-01
                • 2013-10-18
                • 2017-08-01
                • 2011-06-30
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多