将一个数组or列表打乱顺序基本方法

本文介绍两种数组打乱方法:交换打乱法与创建新数组法。交换法通过遍历数组,随机选择元素进行交换;创建新数组法则从旧数组中随机选取元素填充新数组。此外,还提及了Java中Collections.shuffle()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将一个数组or列表打乱的几种基本方法

一、交换打乱方法

从头开始

//交换函数
void swap (int *a, int i, int j)
{
    int tmp = a[i];
    a[i]    = a[j];
    a[j]    = tmp;
}
//从头打乱
 for (i =0; i < a.length; i++)
    {
        index = rand()%(a.length); //打乱所有人顺序
        swap (a,i,index);
    }

从尾开始

//交换函数
void swap (int *a, int i, int j)
{
    int tmp = a[i];
    a[i]    = a[j];
    a[j]    = tmp;
}
//从尾打乱
 for (i = len-1; i > 0; i--)
    {
        index = rand()%(i+1); //打乱所有人顺序
        swap (a,i,index);
    }

方法很简单,就是遍历一遍数组,然后将每一个元素与随机出来的下标进行交换。
但是第二种是交换完之后就将这个元素从随机下标的范围里拿出去,不再进行交换,而第一种不拿出去,有可能该元素会再被后面的元素交换。
第二种方法是网上看到的,因为概率论学的不好,有心而无力,所以也不能证明这种遍历就比第一种好或者坏。但是类似于我们现实中玩扑克,你随便打乱一下就OK,觉得不行就再打乱一次呗。

二、创立新数组法

//使用Java写的列表
ArrayList new=new ArrayList();
        for(int i=0;;i++)
        {
            if(new.size()==old.size())
                break;
        	int n=(int)(Math.random()*old.size());
        	if(!new.contains(old.get(n)))
        	{
        		new.add(old.get(n));
        	}
        	
        		 
        }

这种方法建立一个新列表,然后把旧列表中的元素随机选出并加入新列表。
但是运用时发现,只适用于列表不太长的情况,我当时用的元素个数是200,发现循环的超久的,比如:当你把旧列表中选出了199个,那剩下的一个就不是那么容易就能随机到的

Collections

实际上Java中Collections具有方法shuffle(List)可以将列表元素随机打乱

如果你有更好的方法,或者有什么见解,
可以评论一下( ̄▽ ̄)~*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值