time(NULL); 函式是取目前系统时间,回传值是 long 型态的长整数~
long 型态的变数值范围是 -2147483647 ~ +2147483647~~
加了 (unsigned) 就表示不要负数,范围值会变为 0 ~ 4294967295
srand(long); 函式是设定乱数种子用的,也就是指定乱数要从乱数表的哪个位置开始取~
让他跟着时间变动才可以每次取都不一样的,不然他就会固定从第一个位置取 ^_^
还有~设定乱数种子这个动作只要做一次就可以了~不要加在回圈里一直做~
小妹帮您的程式码改了两个地方,一个是乱数种子的位置,另一个是函式的回传值 ^_^
基本上,乱数种子改了地方,取出来的值应该就很乱了唷 ^_^
照理说您原先的程式是不能跑的,因为您一直在回圈里重设乱数种子位置~让它连续取出的七个值都是一样的~
结果会导致在您的 check 函式中~永远传回 0 ~而步入无穷回圈呢 ^^"
复制程式
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ALLBALL 49
#define CHOOSE 7
int check(int lotto[]);
void bubble(int lotto[]);
void main()
{
int i, j = 0, n, x, y;
int lotto[ALLBALL];
printf ("要几组明牌: ");
scanf ("%d",&n);
srand((unsigned)time(NULL)); // 取乱数种子语法移至此
printf ("~~乐透明牌程式(%d取%d)~~By UBL\n", ALLBALL, CHOOSE);
while (j < n)
{
for (i = 0; i < CHOOSE; i++)
{
lotto[ i ] = 1 + rand() % ALLBALL;
}
if (!(check(lotto)))
j--;
else
{
bubble(lotto);
for (i = 0; i < CHOOSE; i++)
printf ("%02d ", lotto[ i ]);
printf ("\n");
}
j++;
}
system ("pause");
}
int check(int lotto[])
{
int i, j;
for (i = 0; i < CHOOSE; i++)
for (j = i + 1; j < CHOOSE; j++)
if (lotto[ i ] == lotto [j])
return 0;
return 1; //补上这一行让此函式较完整
}
void bubble(int lotto[])
{
int i, j, temp, flag = 0;
for(i = 1; (i < CHOOSE) && (!flag); i++)
{
flag = 1;
for(j = 0; j < (CHOOSE-1); j++)
if (lotto[j] > lotto[j+1])
{
temp = lotto[j];
lotto[j] = lotto[j+1];
lotto[j+1] = temp;
flag = 0;
}
}
}