Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环中使用javascript生成1000个随机的10位数_Javascript_Loops_Random - Fatal编程技术网

在循环中使用javascript生成1000个随机的10位数

在循环中使用javascript生成1000个随机的10位数,javascript,loops,random,Javascript,Loops,Random,我想使用 循环中的javascript。这可能吗?还是说Javascript做这件事是错误的 更新:如何确保不创建重复项 是的,这是可能的 使用Math.random生成伪随机数Math.random返回一个大于或等于0且小于1的伪随机数,因此要得到一个10位数字(我假设是一个整数),您需要将其乘以100000000,然后用Math.round或Math.floor进行四舍五入。(如果您需要全部为10位数字,请相应调整-添加基本金额、乘以更高的数字等) 使用对象跟踪它们,因此var obj={}

我想使用 循环中的javascript。这可能吗?还是说Javascript做这件事是错误的

更新:如何确保不创建重复项

是的,这是可能的

  • 使用
    Math.random
    生成伪随机数
    Math.random
    返回一个大于或等于
    0
    且小于
    1
    的伪随机数,因此要得到一个10位数字(我假设是一个整数),您需要将其乘以100000000,然后用
    Math.round
    Math.floor
    进行四舍五入。(如果您需要全部为10位数字,请相应调整-添加基本金额、乘以更高的数字等)

  • 使用对象跟踪它们,因此
    var obj={}开始

  • 将数字作为键存储在对象中,例如
    obj[number]=true

  • 使用
    if(obj[number])

  • 循环,直到获得正确的唯一编号

  • 我使用对象存储数字的原因是JavaScript对象本质上是映射,引擎经过优化,可以快速从对象检索属性。在幕后,实现可以随心所欲,但可能会使用哈希表或类似工具


    请注意,没有必要为此使用“数组;”,它们只是具有一些特殊功能的对象。

    为什么不呢?代码如下:

    var a=[]; 
    for (var i=1000; i--;) 
     a.push(Math.random()*10000000000)
    

    可以在JS中执行此操作,但必须检查数组以查看它是否包含当前生成的随机数。这显然会降低性能

    看看这些答案是否有用


    以下是我的做法:

    var arr = [],
        track = [],
        min = 1000000000,
        max = 9999999999,
        qty = 1000,
        ii = 0,
        rnd;
    
    while (ii < qty) {
        rnd = Math.floor(Math.random() * (max - min + 1)) + min;
        if (!track[rnd]) {
            arr[ii] = track[rnd] = rnd;
            ii += 1;
        }
    }
    
    var arr=[],
    磁道=[],
    最小值=100000000,
    最大值=9999999,
    数量=1000,
    ii=0,
    rnd;
    而(ii<数量){
    rnd=Math.floor(Math.random()*(max-min+1))+min;
    如果(!轨道[rnd]){
    arr[ii]=轨道[rnd]=rnd;
    ii+=1;
    }
    }
    
    下面是一个工作示例:


    现在,如果
    Math.random
    出现问题,并且由于某种原因会生成大量重复项,那么这段代码可能需要很长时间才能完成。我不认为有任何方法可以解决这种潜在的问题,但是当你谈论大量的唯一随机数时。

    生成长度为l的n个随机数的通用函数可能是:

    // Generate n unique random numbers of length l
    // l should be less than 15
    function genNRandLen(n, l) {
    
      // Make sure l and n are numbers
      n = Number(n);
      l = Number(l);
    
      // Protect against bad input
      if (isNaN(l) || isNaN(n)) return;
    
      var o = {}, a = [], num;
      var min = l == 1? 0 : Math.pow(10, l-1);
      var r = Math.pow(10, l) - min;
    
      // Protect against endless loop
      if (n >= (r)) return;
    
      while (n--) {
        do {
          num = Math.floor(min + (Math.random()*r));
        } while (o[num])
    
        o[num] = true;
        a[n] = num;
      }
      return a.sort();
    }
    
    排序只是为了在测试时容易看到重复项,如果没有必要,请删除,或者首选随机顺序

    如果需要长度超过15位的数字,则可以通过连接较短随机数的字符串并修剪到所需长度来创建这些数字。以下内容将生成任意长度的随机数:

    // Generate random number of length l
    function randLen(l) {
      var n = '';
      while (n.length < l) {
        n += String(Math.random()).replace(/^0\.0*/,'');
      }
      return n.substring(0, l);
    }
    
    //生成长度为l的随机数
    函数randLen(l){
    var n='';
    而(n.长度

    它必须返回一个字符串,因为转换为数字会弄乱结果。哦,所有的数字都是整数。

    是的,这在JavaScript中是可能的。是的,这是可能的。你想知道怎么做吗?我相信这可能会造成重复。这并不能保证数字有10位数。是的,我同意你们两个。但是对于这个特殊的任务,它可能是可以的。其他的检查只是不必要的麻烦。问题明确地说是唯一的随机数。与100000000相乘不能保证10位数number@Balaswamyvaddeman当前位置我猜他指的是10位数或更少。(你的反对票,或者其他人的反对票?对于这样一个小缺陷来说似乎相当有力。)我同意10位数字包括较小的数字,这些数字将在左边用0填充。我猜这取决于你是否考虑了01个两位数的数字。我会把轨道变成一个物体,现在轨道是一个有很多元素的数组。使用对象会更快。在我的测试中,你的方法需要8-9毫秒,使用一个带循环的数组检查重复项需要40-50毫秒,使用一个对象并从中恢复一个10位数的数组需要90毫秒以上。@Creynders:Fish使用数组的方式与使用非数组对象完全相同;没有速度差。他/她根本没有使用数组,当然,JavaScript数组,不是真正的数组。@t.J.Crowder你说得很对,只是做了一个小测试,没有明显的速度差异。我被纠正了。