`
windmark
  • 浏览: 30827 次
社区版块
存档分类
最新评论

如何从数组中随机取出多个不重复的项

    博客分类:
  • Flex
 
阅读更多

1.问题
如何随机取数组中的多个值?给定一个数组,需要从此数组中随机取出不重复几项;

2.应用举例
从20个会员中,随机抽出5个做为幸运奖;
对于这个应用,一个办法是可以在数据库层面解决,如(sql server):
select top 5 * from  (select top 20 * from userid order by userid desc) as b order by newid()
可是有时候,我们需要在编程语言中完成这样的功能,而不是从数据库,下边说的就是使用编程语言实现的方法;

3.实现思路
思路一:写一个无限循环,或者数组长度的循环,使用随机函数,每次从数组中随机抽取1项,同时判断此项是否已被抽取,如果被抽取,则继续循环重新抽取,直到取出不重复5项时,跳出循环;
这办法简单吧?但这个办法不太好,如果需求要求从10万个中随机取出1万个,使用此办法,那么将有1/10的概率每次都取出了曾经取出的那项了,于是需要重新再取,效率自然不高。另外,无限循环或循环数组长度次总让人心里觉得不踏实。

思路二:写一个循环,循环次数为要取出的个数,即取几个就刚好循环几次,每取一次,将取出的项从数组中删除,下次循环再取时,保证不会重复,少了是否重复的判断。

 

//从一个给定的数组arr中,随机返回num个不重复项
function getArrayItems(arr:Array, num:Number):Array {
    //新建一个数组,将传入的数组复制过来,用于运算,而不要直接操作传入的数组;
    var temp_array:Array = new Array();
    for (var index in arr) {
        temp_array.push(arr[index]);
    }
    //取出的数值项,保存在此数组
    var return_array:Array = new Array();
    for (var i = 0; i<num; i++) {
        //判断如果数组还有可以取出的元素,以防下标越界
        if (temp_array.length>0) {
            //在数组中产生一个随机索引
            var arrIndex:Number = Math.floor(Math.random()*temp_array.length);
            //将此随机索引的对应的数组元素值复制出来
            return_array[i] = temp_array[arrIndex];
            //然后删掉此索引的数组元素,这时候temp_array变为新的数组
            temp_array.splice(arrIndex, 1);
        } else {
            //数组中数据项取完后,退出循环,比如数组本来只有10项,但要求取出20项.
            break;
        }
    }
    return return_array;
}
//测试
var my_array:Array = new Array();
for (var i = 0; i<20; i++) {
    my_array[i] = "Num:"+i;
}
my_array = getArrayItems(my_array, 5);
for (var i = 0; i<my_array.length; i++) {
    trace(my_array[i]);
}

 

分享到:
评论

相关推荐

    php 从一个数组中随机的取出若干个不同的数实例

    本文章向码农介绍php从一个不重复的数组中随机的取出若干个不同的元素,难点是防止在取数的时候出现已经取到过的情况(特别是取到最后),需要尽可能的降低碰撞,需要的朋友可以参考下

    JavaScript 产生不重复的随机数三种实现思路

    方法一 思路:首先创建一个1到3000的数组,每次取一个数,然后去除数组中取出的这个数, 这样就可以实现永不重复。 代码如下: [removed] var count=3000; var originalArray=new Array;//原数组 //给原数组original...

    javascript入门笔记

    4、一条语句中声明多个变量 var 变量名1=值,变量名2=值,变量名3; 3、变量名命名规范 1、由字母,数字,下划线以及 $ 组成 var user_name; 正确 var user-name; 错误 var $uname; 正确 2、不能以数字开头 ...

    PHP基于自增数据如何生成不重复的随机数示例

    本文主要介绍了PHP基于自增数据生成不重复的随机数的相关内容,分享出来供大家参考学习,下面多说无益 直接上代码: 关键点在于生成的自增数据位数控制 位数控制在于两个地方  1、 $base 基数组 如果是8位这个...

    《你必须知道的495个C语言问题》

    书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例137 从数组中随机取出元素 165 实例138 合并数组 166 实例139 拆分数组 167 实例140 遍历数组 168 2.11 日期和时间 169 实例141 设置系统的当前时间 169 实例142 将日期和时间转换为时间戳 170 实例143 获取系统...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例137 从数组中随机取出元素 165 实例138 合并数组 166 实例139 拆分数组 167 实例140 遍历数组 168 2.11 日期和时间 169 实例141 设置系统的当前时间 169 实例142 将日期和时间转换为时间戳 170 实例143 获取系统...

    你必须知道的495个C语言问题

    然后又使用一些内存分配技巧使namestr数组用起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明...

    net学习笔记及其他代码应用

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    C#基类库(苏飞版)

    4. 一:随机生成不重复数字字符串 5.方法二:随机生成字符串(数字和字母混和) 6.从字符串里随机得到,规定个数的字符串. 复制代码 22.条形码 BarCodeToHTML 本类是个条码生成类,大家可根据需要自己设置,非常...

    C#基础类库

    取汉字拼音的首字母,只要你输入一个汉字,或者是多个汉字就会取出相应的道字母,主要是方便查询使用的 复制代码 16.配置文件操作类 ConfigHelper 1.根据Key取Value值 2.根据Key修改Value 3.添加新的Key ,Value...

    易语言 茶凉专用模块

    参数 随机渐变, 逻辑型, 可空, 不选不随机颜色 .参数 字体抖动, 逻辑型, 可空 .子程序 查看字节集1, 文本型, 公开, 以易语言文本方式查看字节集,返回文本内容 如:{ 102, 204, 14, 5 } .参数 字节集, 字节集, , 欲...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的...再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的...再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥...

    精易模块[源码] V5.15

    8、修正“时间_时间戳转文本”代码不严谨出现数组错误的BUG,感谢易友[455275321]反馈。 MD5:3E66BFA15806DEAFBCF11806EB99CC11 精易模块 V5.13 what’s new:(20150202) 1、修正“编码_ansi到usc2”当末尾出现10...

    P2P视频技术源码(VC)

    在目前的CP, SP, NP中, CP可以同时加入多个频道, 而NP也可以有多个资源, 为了描述 这种结构, 引入了图的概念. 每个边(Edge)存储了指向NP的指针, 指向Channel的指针, 在TS中还需要存储这一Session在这一Channel中的...

    P2P视频播放器 详细制作实例

    在目前的CP, SP, NP中, CP可以同时加入多个频道, 而NP也可以有多个资源, 为了描述 这种结构, 引入了图的概念. 每个边(Edge)存储了指向NP的指针, 指向Channel的指针, 在TS中还需要存储这一Session在这一Channel中的...

Global site tag (gtag.js) - Google Analytics