JavaScript算法题之–随机数的生成

需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现。

先来生成一个有序的数组:

1 var arr = [],
2     length = 100,
3     i = 0;
4  
5 for( ; i < length; i++ ){
6     arr.push( i );
7 }

从一个长度为 100 的有序数组中随机拿出 10 个随机的数,并且不能有重复。

方法1:随机抽取法

01 var gRandomArr = function( arr, length ){
02     var newArr = [],
03         i = 0,
04         index;
05  
06     for( ; i < length; i++ ){
07         // 利用数组长度生成随机索引值
08         index = parseInt( Math.random() * arr.length );
09         // 将随机索引对应的数组元素添加到新的数组中
10         newArr.push( arr[index] );
11         // 删除原数组中随机生成的元素
12         arr.splice( index, 1 );
13     }
14  
15     return newArr;
16 };
17  
18 // 调用
19 gRandomArr( arr, 10 );

方法1主要是采用基于数组本身的长度去生成随机的索引值,然后将索引值对应的数组元素添加到随机数组中,由于不能有重复,在添加好后将删除原数组的元素。

方法2:随机打乱原数组的顺序,然后再一次性返回

01 var gRandomArr = function( arr, length ){
02     // 使用sort将原数组的顺序打乱,让有序变成无序
03     arr.sort(function(){
04         return Math.random() - 0.5;
05     });
06  
07     // 从原数组中一次性返回10个元素
08     return arr.slice( 0, length );
09 };
10  
11 // 调用
12 gRandomArr( arr, 10 );

方法2采用的办法是先打乱原数组的顺序,但这里需要用到 sort 来对原数组进行排序,如果数组长度较大的话,sort 排序的性能损耗会更大,因为需要遍历整个数组,而随机抽取的话,不需要对整个数组进行遍历,故其性能会更好。

原载于:雨夜带刀's Blog
本文链接:http://stylechen.com/grandomarr.html
如需转载请以链接形式注明原载或原文地址。

最新文章

  1. tomcat配置https
  2. Java-transient
  3. String,你到底创建了几个对象????
  4. have you declared this activity in your AndroidManifest.xml
  5. 使用Django创建简易Blog
  6. 玩玩kafka1 单机安装
  7. Tensorflow卷积神经网络
  8. Rotation Proposals
  9. docker pull报错failed to register layer: Error processing tar file(exit status 1): open permission denied
  10. redux 入门
  11. CF1099F Cookies
  12. HDU 5514
  13. clion中资源文件以及头文件的引用
  14. 学以致用一 安装centos7.2虚拟机
  15. java操作数据库的事务支持
  16. 初识HTML和WEB标准
  17. MySQL数据库启停
  18. 最新最全的iOS手机支付总结
  19. L194
  20. angular4 动态Form中获取表单字段并在页面中使用的方法

热门文章

  1. Spring的javaMail邮件发送(带附件)
  2. 兼容IE, Chrome的ajax function
  3. Table Groups [AX 2012]
  4. Mysql slow query log
  5. php中method_exists()和is_callable()如何进行语句判断
  6. hdwiki 数据库结构说明
  7. ACM第一站————快速排序
  8. js判断radio,checkbox是否选中
  9. IIS装好后,局域网不能访问
  10. 【20160924】GOCVHelper综述