怎样使数组元素乱序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样使数组元素乱序相关的知识,希望对你有一定的参考价值。
已知一个数组有n个元素,分别是1,2,3...n.现在欲使数组中的元素乱序排列,将所有可能情况输出,用C语言应该怎样完成?
用递归吧,总体思想是:第i个的取值的方法是:从让第i个取1到N,如果前i-1都没有取这个值,则第i个取这个值。
#define N 4
int a[N];
bool randArry(int iIndex)
if(N == iIndex)
for(int i = 0; i < N; i++)
printf("%d\\t", a[i]);
printf("\\n");
return true;
int iValue = 1;
//尝试每一个值
while(iValue <= N)
bool bFind = false;
//查看前几个数字是否已经取了该值
for(int i = 0; i < iIndex; i++)
if(iValue == a[i])
bFind = true;
break;
if(true == bFind)
iValue++;
continue ;
a[iIndex] = iValue;
randArry(iIndex + 1);
iValue++;
return true;
int main()
//赋初始值
for(int i = 0; i< N ; i++)
a[i] = 0;
randArry(0);
return 0;
参考技术A 如果说把所有可能情况都输出,那么就是要求全排列吧.如果只是简单的打乱,那么就可以随机交换两个数,循环N次,目的就达到了. 参考技术B #include <stdlib.h>
#include <assert.h>
void shuffle(T* arr, size_t len)
int nloop = len / 2;
char odd = len % 2 != 0;
assert(arr);
for(int i=0; i<nloop; ++i)
int r , tmp;
if( odd && (i==nloop-1))
r = (int)((float)rand()*i/RAND_MAX/nloop)-1;
else
r = (int)((float)rand()*i/RAND_MAX/nloop);
tmp = arr[i];
arr[i] = arr[i+nloop];
arr[i+nloop] = tmp;
循环1/2次就行了,n为奇数时将中间那个数再跟后面的数交换一次,保证中间那个数肯定会被换位置。
这样调用rand( )的次数就只有n/2次,没必要循环N次,因为rand本来就很耗时,能省就省吧。
js数组乱序输出 数组乱序排列
网上看的数组乱序输出,要么不合实际,要么代码繁琐。自己试了下,希望能给大家带来帮助。
重要思想也是Math.random*arr.length随机下标,然后删除取到的元素,继续随机下标。
//将数组乱序输出 var arr = [1,2,3,4,5,6,7,8,9,10]; var newArr = []; for(var i=0; i<arr.length; i++){ var index = Math.floor(Math.random()*arr.length);//随机下标 newArr.push(arr[index]);//将随机出的元素,存放新数组newArr中去 arr.splice(index,1);// 将随机出的元素在arr中删除 } //arr中删除随机出的元素,arr.length-1,同时i++,导致循环不会10次,会是5次.最后得到newArr中只有一半的随机数字,arr中剩下另一半. 将其合并到一起,得到res var res =[...newArr,...arr]; console.log(res)
结果如下:
随后也有个问题,这个其实只随机了一半的数字,后一半没有随机,只是合并了上去。
改进后:
var arr = [1,2,3,4,5,6,7,8,9,10]; var newArr = []; var len = arr.length; for(var i=0; i<len; i++){ var index = Math.floor(Math.random()*arr.length);//随机下标 newArr.push(arr[index]);//将随机出的元素,存放新数组newArr中去 arr.splice(index,1);// 将随机出的元素在arr中删除 } //arr中删除随机出的元素,arr.length-1,同时i++,导致循环不会10次,会是5次.最后得到newArr中只有一半的随机数字,arr中剩下另一半. 将其合并到一起,得到res var res =[...newArr,...arr]; console.log(res)
把len当成,作为循环条件,最后所有的都是随机的,结果如下:
以上是关于怎样使数组元素乱序的主要内容,如果未能解决你的问题,请参考以下文章
iOS小技能:对象数组按照日期分组和排序,使用块代码实现数组排序和乱序。