【領卓教育】不重複隨機點名

不重複隨機點名程序

上一篇博客中記錄了隨機點名,但是總有一些所謂的“天選之人”,點名十有八九可能是他,但這不是程序問題,是概率問題,是運氣太好造成的,比如課堂提問,總一個人也會不好,所以在上個博客的基礎上進行了改進,使被點名的人不會再次被點;

具體代碼參考   “隨機點名”;

原理:

原理相同,詳細查看本篇博客的上一篇,包括隨機數的產生,rand函數的運用,隨機數種子的生成;

程序代碼:

#include <stdio.h>
#include <sys/time.h>
#include <string.h>


char * week[]={"張  震","賈英楠","宋文碩","郭書城","李世超",
		       "羅  新","江偉東","劉明奇","周義航","趙  洋"};  

char * rand_name(char *name[])
{
    int num,i;
    static char buf[100] = {0} ;
    static int len = 0;
    static int flag = 1;
    
    if(flag == 1)
    {
        len = (sizeof(week)/sizeof(char*));
        flag = 0 ; 
    }
    for(i=0;i<1000;i++)
    {
        num = rand()%len ;
        printf("%-10s\r",week[num]);
        usleep(1000);
    }
    strcpy(buf,name[num]);
    for(i=num;i<len-1;i++ )
    {
        name[i] = name[i+1] ;
    }
    len  --;

    return buf ;
}

int main()
{
    int i ,num;

    struct timeval tv  ; 
    struct timezone tz ;
    gettimeofday(&tv,&tz);
    printf("usec=%ld\n",tv.tv_usec%100);
    srand(tv.tv_usec%100);


    for(i=0;i< (sizeof(week)/sizeof(char*)) ;i++) 
    {
        printf("%s\n",rand_name(week) ) ;
    }





    return 0;
}

代碼解釋:

本代碼採用封裝思想,將產生隨機名字部分封裝成函數,使程序變得條理清晰,沒有什麼難點,只是將隨機的名字在數組中刪除,具體刪除方式,找到產生的名字在數組中的位置,讓它的後一位成員賦值前面成員,最後縮短數組長度,所以實現不重複點名;

僅供參考,還是菜鳥;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章