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;
}
}
}