简单说说随机打乱数组的方法

原文链接:http://www.gbtags.com/gb/share/5646.htm

把一个数组随机打乱这个需求来源可能就是“洗牌”,所以我们常常称之为洗牌问题。这个问题实现并不复杂,有不少方法可以完成。与其他算法不同,洗牌问题不仅追求速度,还要求“洗得足够开”。今天只想写篇短的,只分享两种比较有代码性的洗牌方法。至于这些方法能不能真正将数组随机打乱,我们下次再讲。

方法一,随机排序法:

  1. function shuffle(array) {
  2. array.sort(function() {
  3. return Math.random() - 0.5;
  4. });
  5. return array;
  6. }

在线调试和把玩代码: http://www.gbtags.com/gb/rtreplayerpreview/1048.htm

使用javascript的sort方法,让任意两个元素的大小关系随机,从而达到随机打乱数组的目的,非常简单。

方法二,Fisher-Yates shuffle算法

  1. function shuffle(array) {
  2. var rand;
  3. var shuffled = [];
  4. var value;
  5. for(var i = 0; i < array.length; i++){
  6. rand = Math.floor(Math.random() * (i + 1));
  7. value = array[i];
  8. shuffled[i] = shuffled[rand];
  9. shuffled[rand] = value;
  10. }
  11. return shuffled;
  12. }

在线调试和把玩代码: http://www.gbtags.com/gb/rtreplayerpreview/1049.htm

相比第一个算法,这个方法稍微复杂一点,但也很好理解。每次从原数组里取出一个数放到新数组里,但放的时候随机从新数组里找一个值交换一下位置。这个算法很有名,很常用。了解更多

不过并非所有的算法都能正真达到随机打乱,很有可能有些元素出现在各们位置的概率有偏差。那么如何分析这个随机过程,以及各种算法的表现怎么样,下次再说吧。

原文链接:http://www.gbtags.com/gb/share/5646.htm

时间: 2024-10-12 13:03:41

简单说说随机打乱数组的方法的相关文章

随机打乱数组元素

把数组内的元素随机打乱,重新进行排列  C#版: 1 public static void Shuffle<T>(T[] array) 2 { 3 Random random = new Random(); 4 5 for (int i = 0; i < 10; i++) 6 { 7 int idx = random.Next(i, 10); 8 9 //swap elements 10 T tmp = array[i]; 11 array[i] = array[idx]; 12 arr

php保留键随机打乱数组顺序

最近遇到一个需求,把一个数组随机打乱顺序,我们可以用php的shuffle函数,但是这个函数会把数组的键清空建立新的键,那么我们若想保留键只需要利用shuffle函数再做一下处理就可以了.可以自定义一个函数. <?php function retain_key_shuffle(array &$arr){ if (!empty($arr)) { $key = array_keys($arr); shuffle($key); foreach ($key as $value) { $arr2[$v

js【实践】用 js 封装java shuffle函数(打乱数组下标方法)

此方法返回的会是一个全新的数组 所以并不会像java里的shuffle函数一样返回一个引用一样的数组 思路如下: 1.新建一个函数传入需要打乱下标的数组 2.获取数组的长度 3.新建一个用来保存并且返回结果的数组 4.根据数组的长度新建一个随机数(随机数记得要向下取整不然会下标越界) 5.循环添加到结果数组里面 代码如下: <script type="text/javascript"> var testArr = new Array("中国","

一个简单xml数据转换为数组的方法

本人用easywechat做微信回复图文,从数据库中拿到的数据直接是xml拼好的数据,但是框架只有自带的获取xml格式的语句,所有需要将xml数据中所需要的数据拿出来用来拼接. 搜了好多资料说的都很麻烦.ps:可能是我水平不够;-) ok,废话不多说, 上代码: // 以这个xml数据串为例 $xml = "<item><Title><![CDATA[亲爱的顾客:]]></Title><Content><![CDATA[]]>

javascript随机打乱数组

var arr=[]; for(var i=0;i<10;i++){ arr[i]=i; } arr.sort(function(){ return 0.5 - Math.random() }) var str=arr.join(); alert(str); 代码解释: sort 是对数组进行排序它是这样工作的,每次从数组里面挑选两个数 进行运算.如果传入的参数是0 两个数位置不变.如果参数小于0 就交换位置如果参数大于0就不交换位置接下来用刚才的较大数字跟下一个进行比较.这样循环进行排序 恰好

随机打乱数组算法-扑克洗牌

Option Explicit Dim Poker(53) As Long Private Sub Command1_Click() Dim i&, j&, n& Print "---初始化扑克---" For i = 65 To 68 '花色 For j = 1 To 13 '点数 Poker(n) = CLng("&h" & Chr(i) & Hex(j)) n = n + 1 Next j Next i '大小王

随机打乱数组顺序之随机洗牌算法

var shuffleArray = function(array) { var currentIndex = array.length; var temporary; var toIndex; while (currentIndex) { toIndex = Math.floor(Math.random() * currentIndex--); temporary = array[currentIndex]; array[currentIndex] = array[toIndex]; arra

matlab中训练样本随机打乱的方法

使用randperm(),产生随机种子,然后交换位置,达到随机抽取样本的目的. 官方内容: Matlab自带函数randperm(n)产生1到n的整数的无重复的随机排列,利用它就可以得到无重复的随机数. function p = randperm(n); %RANDPERM Random permutation. % RANDPERM(n) is a random permutation of the integers from 1 to n. % For example, RANDPERM(6

伪数组(arguments及字符串)转数组的方法 贼简单

超简单的伪数组转数组的方法, 简单到令人发指! 没错用到的就是这个函数 Array.from() 该函数是Array的一个方法,官方描述就是伪数组转数组的方法: Array.from(arrayLike[,mapFn[, thisArg]); 使用场景1: arguments转数组:Array.from(arguments); 2: 字符串转数组var str = '123abc';var arr = Array.from(str); 3: 其他场景 第二个参数是map函数, 可以对每个item