随机化数组算法,该如何解决

随机化数组算法
本帖最后由 shangyu0801 于 2013-12-01 22:20:39 编辑
int RanDomArray(int array[],int arrayStart,int arrayEnd)
{
//alloc tmp array
int *tmpArray1,*tmpArray2,recordpos = 0;
int i,arrayLen = arrayEnd - arrayStart;

tmpArray1 = (int *)malloc(sizeof(int)*arrayLen);
tmpArray2 = (int *)malloc(sizeof(int)*arrayLen);

if(NULL == tmpArray1 || NULL == tmpArray2){
if(NULL != tmpArray1){
free(tmpArray1);
}
return -1;
}

memset(tmpArray1,0,arrayLen*sizeof(int));
srand(time(NULL));

for(i =0 ; i < arrayLen; i++)
{
while(1){
int pos = rand()%arrayLen;
int value = *(tmpArray1 + pos);
if(value == 0){
tmpArray1[pos] = 1;
tmpArray2[recordpos++] = pos;
break;
}
}
}
memcpy(tmpArray1,array + arrayStart, arrayLen*sizeof(int));
for(i =0 ;i < arrayLen; i++)
{
array[arrayStart + i] = *(tmpArray1 + tmpArray2[i]); 
}

free(tmpArray1);
free(tmpArray2);
return 0;
}


随机化一个数组的算法,我想的随机化一个数组下标,但是总觉这样的想法太粗糙,而且貌似算法复杂度很高啊随机化数组算法,该如何解决,如果有人熟悉STL等高级算法里的思想,一定能想出更好的注意,欢迎批评指正,给出好思路,谢谢。
算法 随机数 随机化数组

------解决方案--------------------
随机洗牌?

最简单的思路就是用随机数作为条件,给数组排序。
------解决方案--------------------
stl里randomXX函数现成的啊。楼主是根本不会偷懒啊,因为库不熟啊。随机化数组算法,该如何解决
------解决方案--------------------
写正确一个随机算法是需要极好的数学基础的,因为你得证明随机性。
还是把精力放在其它更有价值的东西上吧。
------解决方案--------------------
随机化数组下标是神马意思??将数组元素随机排列?
------解决方案--------------------
循环一遍,将第i个和随机出来的位置的元素交换不行吗?
------解决方案--------------------
引用:
Quote: 引用:

写正确一个随机算法是需要极好的数学基础的,因为你得证明随机性。
还是把精力放在其它更有价值的东西上吧。

其实我只是想随机化一个数组,最重要的是我觉得,是思考本身,而不是思考什么问题。
本例中那个for+while(1)的用法,让我很难受,但是实在想不到好的方法。

做一个sort,让sort的依据是随机的。
另外,C++标准库里好像有shuffle吧?你可以看看它是怎么做的。
------解决方案--------------------
引用:
另外,C++标准库里好像有shuffle吧?你可以看看它是怎么做的。

++

C++ 标准库确实有洗牌算法,shuffle

------解决方案--------------------
仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);