首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求大神帮忙解决方案

2013-01-11 
求大神帮忙今天有一道题做不出来……编写一个发牌的程序:我的思路是这样:1、生成一个随机数然后%52;2、然后生

求大神帮忙
今天有一道题做不出来……
编写一个发牌的程序:
我的思路是这样:
1、生成一个随机数然后%52;
2、然后生成第一张牌,记录下来;
3、然后再生成第二张牌,如果不重复就打印出来,否则重新生成;
4、打印出N张随机生成的牌。
但是今天想了一个下午也没弄好,在C++里面的哪个随机生成的函数不记得了……
我想求大神们给个完整的代码,我可以慢慢消化……
[解决办法]
欲生成随机数,主要用到两个函数srand,rand。头文件为:
 
#include <stdlib.h> 
 
 
一、函数
 
1.srand
 
void srand ( unsigned int seed ); 
用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的 rand() 函数会出现一样的随机数。为了防止随机数每次重复常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将 time_t型数据转化为(unsigned)型再传给 srand 函数,即: srand((unsigned) time(&t))  还有一个经常用法,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的 t 数据。srand((int)getpid()); 使用程序的ID (getpid()) 来作为初始化种子,在同一个程序中这个种子是固定的。
 
2.rand
 
int rand ( void ); 
产生一个伪随机数(根据 srand 初始的随机数种子),范围为 0 - RAND_MAX。RAND_MAX 至少为 32767,我电脑为 2147483647(int 型为32位),够用了喝。可通过取模来产生不同范围的随机数,如:
 
int value = rand() % (MAX + 1 - MIN) + MIN;


int genrand(long num, char *file)
{
    long *dat = (long *)malloc(num * sizeof(long));
    long *p = dat, i;
    
    if (dat == NULL){
        printf("malloc error, memory not enough!\n");
        exit(1);
    }
    
    srand( (unsigned int)time(0) );
    for (i = 0; i < num; i++){
        dat[i] = rand();
    }
    
    /* 保存到文件中 */
    FILE *fp = fopen(file, "w");
    if (fp == NULL){
        printf("fopen error, can't open file %s!\n", file);
        exit(2);
    }
    
    while (*p){
        fprintf(fp, "%ld\n", *p++);
    }
    free(dat);
    fclose(fp);
    
    return 0;    
}

[解决办法]
洗牌算法参考:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */


            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}

热点排行