设为首页 加入收藏

TOP

C语言之random_n-续
2014-11-23 23:33:46 来源: 作者: 【 】 浏览:1
Tags:语言 random_n-

之前写拉一个random_n的算法实现,虽然简单易懂,但是算法的效率相对来说不算很高,节省拉空间,只用到拉一个数组实现。

这个random_n的实现用到拉两个数组,子函数中的数组在函数栈销毁时释放空间。最好和最坏运行时间都是O(N )。主要时利用拉空间换时间。

具体的代码实现如下:

#include

#include

#define MAX_NUM 10

void random_n(int a[],int n);

int main()

{

int a[MAX_NUM],i=0,j=0;

while(j

{

a[j]=-1;

j++;

}

random_n(a,MAX_NUM);

while(i

{

printf("%d\t",a[i]);

i++;

}

printf("\n");

return 0;

}

void random_n(int a[],int n)

{

int temp[n],k=0,count=0,x=0;

while(k

{

temp[k]=k;

k++;

}

srand(time(0));

count=n;

k=0;

while(count)

{

x=rand()%count;

a[k]=temp[x];

printf("X= %d\t temp= %d \n",x,a[k]);

temp[x]=temp[count];

count=count-1;

k=k+1;

x=0;

}

}

调试和运行结果:

主要的思想:先产生0-N 之间的所有数,然后依次产生一个随机数,把产生的随机数当做下标,访问已经产生的有序数组,并取出下表所对应的值付给我们传进来的元数组。然后把这个数用最后一个数据覆盖掉。然后让产生随机数的模减1,这样下次访问的有效范围便是之前没有访问过的。这样依次循环进行知道数组填满。

思考过程如下:

----------------------------------------------------------------------------------------------

| 0 | 1 | 2 | .。。。 | 。。。 | N-1 | N |

-----------------------------------------------------------------------------------------------

假如产生的随机数为2,则:

----------------------------------------------------------------------------------------------

| 0 | 1 | N | .。。。 | 。。。 | N-1 | N |

-----------------------------------------------------------------------------------------------

下一次的寻址范围是:

----------------------------------------------------------------------------------------------

| 0 | 1 | 2 | .。。。 | 。。。 | N-1 | N |

-----------------------------------------------------------------------------------------------

依次覆盖。

摘自 明月天涯

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言之random_n 下一篇C语言要点

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: