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

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

    博客分类:
  • 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]);
}

 

分享到:
评论

相关推荐

    JS从数组中随机取出几个数组元素的方法

    - 当需要从数组中随机取出多个元素时,确保传入的`count`值不超过数组元素总数。 - 要注意的是,上述方法在处理大数据量的数组时可能会有些性能损耗,因为每次交换元素都要进行一次数组复制。 - 如果取出元素时不...

    JS 随机从数组中取出几个元素

    在JavaScript编程中,随机从数组中取出几个元素是一项常见的任务,尤其在开发各种应用场景如抽奖系统、模拟随机数据等时。本篇文章将深入探讨如何实现这个功能,同时也会提供一个实用的示例代码来帮助理解。 首先,...

    JS 在指定数组中随机取出N个不重复的数据

    本文介绍的方法就是如何使用JS来实现在指定数组中随机取出N个不重复数据的需求。 首先,理解函数`getArrayItems(arr,num)`的作用:它接受两个参数,`arr`是一个已经存在的数组,`num`是需要从`arr`中随机取出的不...

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

    在处理数组数据时,经常需要从数组中随机取出若干个不重复的元素。这在很多应用场景中非常常见,比如从用户数据库中随机抽取一部分用户进行调查,或者随机生成测试数据等。为了解决这一需求,PHP提供了内置的函数和...

    java利用数组随机抽取幸运观众

    在Java编程语言中,随机抽取幸运观众可以通过数组来实现,这是编程中常见的一个操作,用于从一组数据中随机选择一个或多个数据项。以下是对【标题】和【描述】中所述知识点的详细说明: ### 知识点一:数组的定义和...

    0-99的不重复随机数

    在编程领域,生成0到99之间不重复的...通过以上分析,我们可以看到,生成0-99的不重复随机数虽然看似简单,但背后涉及到了随机数生成、数据结构、算法以及错误处理等多个编程知识点,这些都对提升编程能力大有裨益。

    php获取随机数组列表的方法

    这个函数用于从数组中随机取出一个或多个键值。它的第一个参数是一个数组,第二个参数(可选)指明你希望返回的随机键的数量。在一些情况下,当指定返回的键的数量大于数组元素的总数时,`array_rand`会返回所有元素...

    javascript入门笔记

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

    原生js当页面刷新多张图片随机显示代码

    - 获取到随机索引后,我们可以使用这个索引从数组中取出一个图片URL,并将其赋值给图片元素的`src`属性,以达到随机显示图片的效果。假设`imgs`是所有图片元素的集合,可以写成`imgs[i].src = imageUrls...

    php对数组内元素进行随机调换的方法

    6. 数组随机排序:除了`shuffle()`,还可以使用`rsort()`、`sort()`等函数结合随机数实现。 7. 字符串随机分割:可以将字符串拆分成多个不同长度的子串数组,常用于密码生成或文本处理。 8. 从数组中随机取值:可以...

    php array_slice 取出数组中的一段序列实例

    5. 保留键名的情况下取出数组从第三个元素开始到最后但不包括最后一个元素: ```php print_r(array_slice($input, 2, -1, true)); ``` 结果:`Array ( [2] =&gt; c [3] =&gt; d )` ### 相关知识点 - **与 `array_splice`...

    PHP生成不重复随机数的方法汇总

    首先通过`range()`函数生成一个有序数组,然后使用`shuffle()`函数随机打乱数组中元素的顺序,最后用`array_slice()`从打乱后的数组中取出需要的部分,即为不重复的随机数数组。这种方法的代码简洁,易于理解,适用...

    php中的数组操作函数整理

    25. **array_rand**:从数组中随机选择一个或多个元素,返回选定的键名。 26. **array_reduce**:使用用户定义的回调函数,迭代地将数组简化为单一的值。 27. **array_reverse**:返回一个与原数组顺序相反的新...

    visualfoxpro 随机抽签系统

    在这个系统中,我们可以预设一系列的参与者名单,然后通过程序进行随机抽取。"随机抽签"标签明确了该系统的关键技术点,即运用VFP的随机数生成函数来实现抽签过程的不确定性。 二、开发环境与准备 首先,我们需要...

    php参考手册.pdf

    6. `array_diff()`、`array_diff_assoc()`、`array_diff_key()`、`array_diff_uassoc()`、`array_diff_ukey()`:这些函数用于比较多个数组,返回在第一个数组中存在的但不在其他数组中的元素。`_assoc`和`_uassoc`...

    易语言取不重复随机数-易语言

    "易语言取不重复随机数"是易语言编程中一个常见的问题,通常涉及到数组、循环和随机数生成等基本概念。 在易语言中,生成随机数可以使用内置的“随机数”命令,该命令会返回一个在指定范围内的随机整数。例如,`...

    随机抽奖源代码

    如果希望有多个奖项,可以重复此步骤,但需注意排除已中奖的参与者,以防止重复。 4. **公正性验证**:为了增加透明度,可以提供随机种子值,使得抽奖过程可复现。用户可以输入相同的种子值,查看相同的抽奖结果,...

    易语言取随机列表项目源码.7z

    在“易语言取随机列表项目源码.7z”这个压缩包中,我们主要关注的是如何在易语言中实现从列表中随机选取元素的功能。这个功能在很多应用场景中都非常实用,例如游戏中的随机事件、模拟系统的随机决策等。 首先,...

    一个十分优秀的抽签系统

    首先,我们要理解抽签的核心逻辑:在不重复的情况下随机选择一个或多个元素。在编程中,这通常通过以下步骤实现: 1. **初始化数组**:创建一个包含所有参与者的数组。每个元素代表一个参与者的名字或其他标识符。 ...

Global site tag (gtag.js) - Google Analytics