Home  >  Article  >  Web Front-end  >  javascript生成不重复的随机数_javascript技巧

javascript生成不重复的随机数_javascript技巧

WBOY
WBOYOriginal
2016-05-16 15:50:011575browse

题目来源:在慕课学习jQuery过程中一道测试题。

初始时:<ul>元素中仅显示5个<li>元素,其中包含还包括最后一个<li>元素,<a>元素中的显示"更多"字符.

当点击"更多"链接时,自身内容变为"简化",同时,<ul>元素中显示全部的<li>元素.

当点击"简化"链接时,自身内容变为"更多",同时,<ul>元素中仅显示包含最后一个<li>元素在内的5个元素.

核心点:他没讲需隐藏哪几个

  • 元素啊,那么我希望列出8个
  • 元素,点简化随机隐藏前7个
  • 元素中的3个。

    思路:

    ①从0~6中生成3个随机数。

    ②判断3个随机数是否相等,不相等则执行隐藏操作。

    ③3随机数有重复,则重新执行函数。

    实现:生成0~6的一个随机数

    复制代码 代码如下:
    var ran1=parseInt(Math.random()*7); //Math.random()生成[0,1)的一个随机数

    完整代码:
    <!DOCTYPE html>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script language="javascript" type="text/javascript" src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
        <title>挑战题</title>
      </head>
      
      <body>
        <ul>
          <li>0</li>
          <li>1</li>
          <li>2</li>
          <li>3</li>
          <li>4</li>
          <li>5</li>
          <li>6</li>
          <li>7</li>
        </ul>
        <a id="btn" onclick="cli()">简化</a>
      </body>
      <script>
        $(function cli(){
          $("#btn").css("cursor","pointer");
          if($("#btn").html()=="简化"){
          var ran1=parseInt(Math.random()*7);
          var ran2=parseInt(Math.random()*7);
          var ran3=parseInt(Math.random()*7); //①从0~6中生成3个随机数完成
          if(ran1!=ran2&&ran1!=ran2&&ran2!=ran3){ //②判断3个随机数是否相等,不相等则执行操作。
          $('li:eq('+ran1+')').css('display','none');  
          $('li:eq('+ran2+')').css('display','none');    
          $('li:eq('+ran3+')').css('display','none'); 
          $("#btn").html("更多");
          }else{  //③3随机数有重复,则重新执行函数。
            cli();
          }
          }
          
          else{
            $("li:hidden").css('display','list-item');
            $("a:contains('更多')").html("简化");
          }
          
          });
    
      </script>
    </html>
    
    

    收获一:

    复制代码 代码如下:
    var ran=parseInt(Math.random()*(max-min+1)+min); //生成一个[min,max]区间的一个随机数

    收获二:

    反思了下,决定写个在一定[min,max]区间,生成n个不重复的随机数的封装函数。

      思路一:先生成n个[min,max]区间随机数,比较是否重复,如重复则返回,再次执行。

      演示地址:http://jsbin.com/yupuyehuqa/edit?html,js,output

      封装函数:

    function my_ran(n,min,max){
     var arr=[];
     for(i=0;i<n;i++){
      arr[i]=parseInt(Math.random()*(max-min+1)+min);
     }
     for(i=0;i<n;i++){
      for(j=i+1;j<n;j++){
       if(arr[i]==arr[j]){
        my_ran(n,min,max);
        return fault;
       }
      }
     }
     return arr;
    }
    
    

      思路二:生成第i个[min,max]区间的随机数,并与之前i-1个数比较,如有重复,令i=i-1;重复生成第i个随机数。

      演示地址:http://jsbin.com/zorunotosi/edit?html,js,output

      封装函数:

    function my_ran2(n,min,max){
     var arr=[];
     for(i=0;i<n;i++){
      arr[i]=parseInt(Math.random()*(max-min+1)+min);
      for(j=0;j<i;j++){
       if(arr[i]==arr[j]){
        i=i-1;
        break;
       }
      }
     }
     return arr;
    }
    
    

      思路三:生成[min,max]区间的一个顺序数组,打乱数组,输出前n个值。

      演示地址:http://jsbin.com/zorunotosi/edit?html,js,output

      封装函数:

    function my_ran3(n,min,max){
     var arr=[];
     var arr2=[];
     for(i=0;i<max-min+1;i++){
      arr[i]=i+min;
     }
     for(var j,x,i=arr.length;i;j=parseInt(Math.random()*i),x=arr[--i],arr[i]=arr[j],arr[j]=x);
     for(i=0;i<n;i++){
      arr2[i]=arr[i];
     }
     return arr2;
    }
    
    

      思路四:生成[min,max]区间的一个顺序数组,从中随机选出一个值,然后在数组中删掉这个值,再选第二个随机值。

      演示地址:http://jsbin.com/zorunotosi/edit?html,js,output

      封装函数:

    function my_ran4(n,min,max){
     var arr=[];
     var arr2=[];
     for(i=0;i<max-min+1;i++){
      arr[i]=i+min;
     }
     for(i=0;i<n;i++){
      var x=parseInt(Math.random()*arr.length);
      arr2[i]=arr[x];
      for(j=x;j<arr.length;j++){
       arr[j]=arr[j+1];
      }
      arr.length=arr.length-1;
     }
     return arr2;
    }
    
    

    太晚了,明儿有空再调格式了。

    以上所述就是本文的全部内容了,希望大家能够喜欢。

  • Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn