我们经常用到的rand函数产生的随机数通常遇到两个问题
-
运行两次产生随机数相同
如果我们不调用用随机数发生器初始化(随机数种子)那么随机数函数种子默认为1多次产生随机数的起点一样,所以我们调用srand(time(0))就可以改变随机数种子. -
产生的随机数中有重复
那如何产生多次产生的随机数不同又不重复呢? rand函数产生的随机数本身重复率是比较低的,但是当我们用取余产生的一定范围的随机数会大大增加重复的概率.比如我要取0-10内的数rand()%10+1
rand产生的10 20120 230 340…其随机数都为1
以下程序就是c语言将重复剔除
源程序
/** author :jill
* data :2019-9-11
* function:c语言生成一定范围的随机数,且不重复,
* 本例程生成1~52的随机数.
*/
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"time.h"
int arr[52];
int check(int arg)
{
for(int j=0;j<52;j++)
{
if(arr[j]==arg)
return 1;
}
return 0;
}
int main()
{
memset(arr,0,sizeof(arr));
int tmp=0,i=0;
srand(time(NULL)); //随机数种子
while(i<52)
{
tmp=rand()%52+1; //产生1-52的随机数rand()(max-min+1)+min生成[min,max]的随机数
if(check(tmp)==1) continue;
arr[i]=tmp;
printf("arr[%d]=%d\n",i,arr[i]);
i++;
}
return 0;
}
程序2
发牌游戏
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"time.h"
int arr[52];
int i=0;
int check(int arg)
{
for(int i=0;i<52;i++)
{
if(arr[i]==arg)
return 1;
if(arr[i]==0)
return 0;
}
return 0;
}
/*洗牌产生不同的52位随机数*/
int xp()
{
int tmp=0;
memset(arr,0,sizeof(arr));
srand(time(NULL));
while(i<52)
{
tmp=rand()%52+1;
if(check(tmp)==1) continue;
arr[i]=tmp;
i++;
}
}
/*发牌将52张牌轮流发个四个人每人十三张*/
void fp()
{
int play[4][13];
memset(play,0,sizeof(play));
printf("第一个人的牌为:");
for(i=0;i<13;i++)
{
printf("%2d ",arr[4*i]);
}
printf("\n");
printf("第二个人的牌为:");
for(i=0;i<13;i++)
{
printf("%2d ",arr[4*i+1]);
}
printf("\n");
printf("第三个人的牌为:");
for(i=0;i<13;i++)
{
printf("%2d ",arr[4*i+2]);
}
printf("\n");
printf("第四个人的牌为:");
for(i=0;i<13;i++)
{
printf("%2d ",arr[4*i+3]);
}
printf("\n");
}
/*主函数*/
int main()
{
xp();
fp();
return 0;
}
jill@DESKTOP-EIC0724:~/mydemo/task2$ ./a.out
第一个人的牌为:27 6 17 25 47 23 51 29 4 11 5 33 50
第二个人的牌为:49 35 31 7 10 42 34 44 39 46 2 30 38
第三个人的牌为:28 40 3 19 14 8 15 22 12 32 41 48 43
第四个人的牌为:21 45 18 24 16 13 36 52 20 26 9 1 37