产生[a,b]以及[c,d]间的随机数

来源:互联网 发布:螺旋箍筋的算法 编辑:程序博客网 时间:2024/05/22 14:36

有时,需要的随机数并不是在一个连续的范围内的,而是类似于[a,b]和[c,d]间取值,或者是产生一定数量的不重复的整数。

本文的方法便是建立一定的数组,用rand()产生的数值作为数组的下标,再将所得数据与数组最后一个数值进行交换,然后将rand()的范围上限减1,

比如产生[1,50]间不重复的5个随机数,先产生1个[0,49]随机数n,根据随机数n取出a[n]的数并将之与a[49]相交换,再产生一个[0,48]的随机数,依次类推

 

# include # include # include # define SWAP(x,y) (x)=(x)+(y);(y)=(x)-(y);(x)=(x)-(y)int main(){int num_rand = 5;int nRand[5];int num_sum = 50;int num[50];int k = 0;int num_begin = 1;int num_end = 50;for(int i=0;i

但使用上述方法会使函数有一定的局限性,故本文需要使用动态分配的内存来提高函数的随机性。

 

# include # include # include # define SWAP(x,y) (x)=(x)+(y);(y)=(x)-(y);(x)=(x)-(y)void wf_rand(int,int,int,int**);int main(){int num_rand = 5;int num_begin = 1;int num_end = 50;int *pRand;wf_rand(num_begin,num_end,num_rand,&pRand);for(int i=0;i

因为代码里的函数使用了malloc来分配内存,故本函数使用需要考虑动态内存的释放。而[a,b]与[c,d]间的随机数便可通过对上述函数进行一定的修改便可实现。

如:

bool wf_rand(int set[],int set_len, int result[],int result_len,int flag){if (0!=(set_len%2)){printf("This module need a even number\n");return 1;}int num_data = 0;int data_num = 0;int rand_num = 0;int tmp = 0;for(int i=0;i