【问题标题】:How to Generate Random numbers in Javascript based on the provided range Minimum and Maximum characters如何根据提供的范围最小和最大字符在 Javascript 中生成随机数
【发布时间】:2020-10-09 14:00:49
【问题描述】:

我有一个奇怪的要求,我需要生成用户给定长度的随机数。用户可以给Minimum LengthMaximum Length,我需要生成包含这个范围之间的字符长度的随机数。

例如,如果Minimum Length6Maximum Length10,那么我需要生成字符数必须在610 之间的随机数。对于此示例,以下可以是随机生成器:

123456,
7654321,
12345678,
987654321,
5432109876, etc.

像这样,随机生成器必须包含提供的输入之间的长度。

我知道如何根据固定字符长度在范围之间创建随机数,但我不知道如何根据可变长度创建随机数。我试图找到答案,但大多数都是基于固定长度和固定范围,找不到我正在寻找的完全匹配。

如果有人能帮我解决这个问题,那就太好了。

【问题讨论】:

  • 我会先随机化提供的最小和最大长度之间的长度,然后在该长度可以拥有的最小数字和该长度可以获得的最大数字之间随机化

标签: javascript node.js random variable-length


【解决方案1】:

您可以生成一个数组(Array.from(),其长度在minLenmaxLen 范围内随机选择)并用1 到9 范围内的随机数字填充该数组,然后将Array.prototype.join() 数组转换为字符串和转换为数字:

const randomNum = (minLen, maxLen) => 
                    +Array
                      .from(
                        {length: 0|Math.random()*(maxLen-minLen+1)+minLen},
                        () => 0|Math.random()*9+1
                      )
                      .join('')
                      
console.log(randomNum(3,7))

【讨论】:

  • 我无法理解代码中发生的所有事情,但它按预期工作。如果我想修改此函数以生成Alphanumeric 随机数,那么我该如何修改呢?
【解决方案2】:

您可以生成范围并从该范围中获取随机值。

例如

min = 2
max = 4

rangeMin = 10
rangeMax = 10000

const
    getRandom = (min, max) => Math.floor(Math.random() * (max - min)) + min,
    getRandomX = (min, max) => getRandom(10 ** (min - 1), 10 ** max);

let min = Infinity,
    max = -Infinity;

for (let i = 0; i < 1e6; i++) {
    let r = getRandomX(6, 10);
    if (min > r) min = r;
    if (max < r) max = r;
}

console.log(min, max);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案3】:

    其他解决方案为每个数字生成随机数并将它们连接在一起形成一个数字。这是不必要的。我们知道至少有m-th 个数字的数字至少是10m - 1。同样,最多有n 位数意味着该数字小于10n

    const randomWithinRange = (min, max) => Math.floor(Math.random() * (max - min) + min);
    const randomWithMagnitude = (min, max) => randomWithinRange(Math.pow(10, min - 1), Math.pow(10, max));
    
    const arr = Array(100000).fill().map(() => randomWithMagnitude(6, 10)).sort((a, b) => a - b);
    console.log(arr.slice(0, 100).join(", "));
    console.log(arr.slice(99900, 100000).join(", "));

    注意:我对 100.000 大小的数组进行了排序,只是为了向您展示生成的最小和最大数字。

    【讨论】:

      【解决方案4】:

      试试这个:

      var minLength = 6;
      var maxLength = 10;
      var generatedNumbers = [];
      for(var i=minLength ; i<=maxLength; i++){
         var num = "";    
         for(var j=1;j<=i;j++){
             num = num + Math.floor(Math.random(10) * 10);   
         }
         generatedNumbers.push(num);
      }
      console.log(generatedNumbers);
      

      编辑

      var minLength = 1;
      var maxLength = randomNumber;
      var generatedNumbers = [];
      for(var i=minLength ; i<=maxLength; i++){
         var num = "";    
         for(var j=1;j<=i;j++){
             num = num + Math.floor(Math.random(10) * 10);   
         }
         generatedNumbers.push(num);
      }
      console.log(generatedNumbers);
      

      这会有所帮助。

      【讨论】:

      • 感谢您的回复。但似乎这是先生成 6 个,然后是 7 个,然后是 8 个字符的随机数。我正在尝试创建随机数,因为随机数的长度也几乎是随机的,比如它可以是 6 位然后 9 位然后 7 位等等,有没有办法可以修改它?
      【解决方案5】:

      非常感谢大家的回答。这是我使用的方法。

      如果只需要带有数字的随机数:

      var charset         = "0123456789";
      var max_Length      = 5;
      var min_Length      = 10;
      var charPicker      = Math.floor(Math.random() * (max_Length - min_Length + 1) + min_Length);
      var randomId;
      for (var i = 0; i < charPicker; i++)
      {
          randomId += charset.charAt(Math.floor(Math.random() * charset.length));
      }
      console.log(randomId);
      

      使用 URL 特定字符更改字母数字和字母数字的字符集,如下所示:

      var charset         = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
      var charset         = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~()'!*:@,;";
      

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多