首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

用c生成一个0-8无重复数字的随机数组的比较高效的算法解决办法

2012-04-25 
用c生成一个0-8无重复数字的随机数组的比较高效的算法我的代码是这样的:C/C++ codeint CreatMatrix(int *m

用c生成一个0-8无重复数字的随机数组的比较高效的算法
我的代码是这样的:

C/C++ code
int CreatMatrix(int *matrix){    int i,j;    int buf;    for(i=0;i<9;i++)    {        getElem:        srand((unsigned)time(NULL));        buf=rand()%9;        for(j=0;j<i;j++)        {            if(matrix[j]==buf)            goto getElem;        }        matrix[i]=buf;    }    return OK;}

但是上面的代码要花10秒钟才能执行完,我想找一个比较高效点的算法

[解决办法]
这样的算法重复的无谓计算太多。时间消耗就大,

if(matrix[j]==buf)
这里如果相等的时候,就把(buff+1) % 9,或者做其他的计算,填到别的空去
[解决办法]
生成随机排列可以用Floyd算法。为代码如下:

for I := M downto 2 do
J := RandInt(1, I)
Swap(X[J], X[I])

原理请参考《编程珠玑II》第十三章 绝妙的取样。
[解决办法]
b[0~8]=0
if(b[a[x]]==0)
b[a[x]]=1;
else
继续随机
直到 b[0~8]==1

欢迎加入QQ群
26406124
[解决办法]
写个函数替换之前的代码:

#pragma warning(disable:4786)
#include <vector>

#define N 9

void SrandArray(int *a , int num)
{
vector<int> vecInt;

for(int i=0 ; i<num ; ++i)
{
vecInt.push_back(i);
}

srand(unsigned(time(NULL)));

for(int j=0 ; j<num ; ++j)
{
int index = rand() % vecInt.size();
a[j] = vecInt[index];
vecInt.erase(vecInt.begin() + index);
}
}

热点排行
Bad Request.