zoukankan      html  css  js  c++  java
  • JavaScript算法题之–随机数的生成

    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
    如需转载请以链接形式注明原载或原文地址。
  • 相关阅读:
    c# Invalidate() Update() Refresh()的区别
    Winform重画ComboBox背景色
    窗口过程 Wndproc
    设置DatagridView的列头样式
    SQL2005 全文检索超时的解决方案
    winform 获取当前程序运行根目录
    Web API-如何将Controller的返回值转换成HTTP response消息
    ASP.NET Web API 如何通过程序控制返回xml还是json
    C# web api返回类型设置为json的两种方法
    多组 RadioButtonList 获取值
  • 原文地址:https://www.cnblogs.com/lmy-ms/p/3863649.html
Copyright © 2011-2022 走看看