zoukankan      html  css  js  c++  java
  • 还有更简单的不重复随机数生成方法吗?

      这是一个关于javasript的问题。

      偶然间想到一个我们经常会用到的东西,生成一组不重复的随机数(比如:生成10个小于32的随机数,不能重复。)。在C#中这压根就不是什么问题,一个contains就能判断一个元素是否在数组中存在,但是到了js里没有一个简单的方式可以判断某个值是否在数组中是否已经存在。既然没找到相关的函数就只能想想办法了。那是循环呢?还是循环呢?循环?循环?.......

      想了很久,最终想到了这样的一个方法:

      首先利用js对象来判断新的随机数是否已经存在过了。如果没有再加入到对象到属性中和结果数组中。贴上代码:

     1 function getNo() {
     2     var res = {}, rleng = [];
     3 
     4     while (rleng.length < 10) {
     5         var n = Math.round(Math.random() * 31);
     6         if (res[n]) {
     7             continue;
     8         }
     9         res[n] = n;
    10         rleng.push(n);
    11     }
    12     return rleng;
    13 }

    虽然js没有直接可以判断某个元素是否在数组中存在的方法,但可以简单的判断某个属性是否在某个对象中存在。呵呵~,取了个巧。

    其实除此之外还有另外的一种方法:

     1 function getNos()
     2 {
     3     var str="",res=[];
     4     while (res.length < 10) {
     5         var n = Math.round(Math.random() * 31);
     6         if (str.indexOf("["+n+"]")) {
     7            res.push(n);
     8             str+="["+n+"],";
     9         }
    10     }
    11     return res;
    12 }

    两个方法大致思路上都差别不大,一个是利用对象,一个是字符串。(感谢细心的朋友提出宝贵的意见,这里加上[]防止indexof在类似12和2这样多情况下出现bug)。

    下面是@double Net过客冲冲的方法,这是一种很科学的方法!(悄悄的改造了下):

      

     1 var getUnique=function(min,max,count){
     2     var arr=[];
     3     for(var i=min;i<max;i++){
     4         arr.push(i);
     5     }
     6     arr=arr.sort(function(l,r){
     7         return Math.random()>Math.random();
     8     });
     9     return arr.slice(0,count);
    10 };


    //getUnique(1,20,5)
    //[10, 1, 3, 16, 5]

    javascript小白,只能想到这里了。如果您有更简单,更有效的方法吗?请帖出来吧。

    (@转载请注明出处:http://www.cnblogs.com/aser1989/p/4991530.html)

      

  • 相关阅读:
    @Autowired注解与@Qualifier注解搭配使用
    前端中具体实现
    js文件处理
    跨域解决方案
    WebSocket实现
    js触摸操作
    RPC框架gRPC
    RPC框架Thrift
    分布式RPC
    RPC基本原理
  • 原文地址:https://www.cnblogs.com/aser1989/p/4991530.html
Copyright © 2011-2022 走看看