//盗墓者是个丑奴儿,原
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
//宏定义:传入数组,返回数组长度
#define str_l(arry) (sizeof(arry)/sizeof(arry[0]))
int main(void){
//10个人名字,缩减为字母代替,且只有4个,方便测试
char * arr[]={"A","B","C","A"};
//抽出来的人名,进行保留的数组
char * arr_t[3]={0};
int j=0;
//获取当前时间设置随机数种子
srand(time(NULL));
//判断条件:当数组最后一个值不为null,判断数组已经填充满随机值了
while(arr_t[str_l(arr_t)-1]==NULL){
char * str=arr[rand()%str_l(arr)];
for(int i=0;i<str_l(arr_t);i++){
if(str!=arr_t[i]){ //判断随机出的值,在数组中已经有过了,有就跳出,如果判断到数组末尾,代表随机值 //没有重复
if(i==(str_l(arr_t)-1)){
arr_t[j]=str;
j++;
}
}else{
break;
}
}
}
//打印出数组的值
for(int i=0;i<3;i++)
printf("%s ",arr_t[i]);
printf("\n");
return 0;
}
注意:先设置srand随机数种子,在rand随机
如果不设置srand,在第一次运行程序时,根据srand随机数种子进行算法运算得出随机值,rand的值是随机的值。再次运行程序,srand没有被改变,依然根据srand运算。算法是有规律的,值的不变,会导致再次运行程序算出的rand的值依然没变,形成了rand的值是一成不变,需要改变srand随机数算法的值,才能算出不一样的值
在每一次运行程序时,设置不一样就可以了,在本次程序运行时将是随机的。在这里是使用time获得当前事件,来设置srand。在循环每次设置srand是没有意义的,time差距的1s够cpu执行很久了,所以rand值依然不变,试试取得毫秒呢?
运行结果: