c 亂數重複的問題

2008-01-26 2:48 am
我想問用c既rand()點樣可以拎到42個唔同既數
我想用c黎寫個random整坐位表既program
我個課室係有8行
第1行&第8行有6個位
其他有5行

有冇人可以幫下我,,
謝!*

回答 (2)

2008-01-26 4:34 am
✔ 最佳答案
首先我想告訴你, 你的 int array a[7][5] 有問題, 這個 array 只有 7 x 5 = 35格, 你怎可以放42個數字入去?

你是想把 42 個學號像洗啤牌那樣洗勻吧? 如果你單純使用 rand()%42+1, 有可能出現相同的號碼. 簡單的洗牌方法有好幾個, 最易寫的是使用 "交換" (swap).

1. 設一個42格的 int array, 填上 1 至 42 號.
2. 隨機選兩格, 把內容互相交換.
3. 重覆第 2 步很多次. (例如 100 次)
4. 把 array 列印出來.

int array[42];
int i, temp, a, b;

srand(time(NULL));

/* 第 1 步 */
for(i=0; i<42; i++)
array[i] = i+1;

/* 第 2 和 第 3 步 */
for(i = 0; i<100; i++)
{
/* 隨機選兩格, 就算相同也沒關係 */
a = rand()%42;
b = rand()%42;

/* 把兩格的內容對調 */
temp = array[a];
array[a] = array[b];
array[b] = temp;
}

/* 第 4 步 */
for(i = 0; i< 42; i++)
{
printf("%2d ", array[i]);
if((i%5 == 0) && (i != 0) && (i != 40))
printf("\n");
}

事實上, 2維的 array 也不需要用. 想把號碼洗得更勻, 把 100 改成 1000 便可以了.

2008-01-25 23:21:38 補充:
回補充:0-5的確有六格, 但你宣告 array 時便要用int a[6] 才可以.宣告了 int a[6] 的話, 你可以用 a[0] (第一格), a[1] (第二格)... 至 a[5] (第六格), 但 a[6] 是不存在的. 所以, 你宣告了 int a[5] 的話, 只能用 0 至 4.

2008-01-25 23:22:00 補充:
雖然那些<全變了<, ”又變了"(可惡的 Yahoo 知識沒有 [code][\code]的功能), 但以上的程式執行後也會像個列表般 print 出來. 在 data 層面 (例如 array) 和用家看到的層面 (print 出畫面) 是分開的, 我們看到是個表格的東西在 data 未必是個表, 相反在 data 是個表的話我們也未必會看到像個表.

2008-01-25 23:22:38 補充:
如果堅持想用二維的陣列的話, 再使用 swap 方法會變得太複雜. 當然可以在「洗牌」完畢後才把 array[] 的內容填到你想要的二維陣列, 例如:

2008-01-25 23:22:55 補充:
/* 開頭加入這些宣告 */int finalArray[8][6];int row, col;/* 把資料填入 */row = 0;col = 0;for(i = 0; i

2008-01-25 23:24:01 補充:
亂碼了./* 開頭加入這些宣告 */int finalArray[8][6];int row, col;/* 把資料填入 */row = 0;col = 0;for(i = 0; i<42; i++){ finalArray[row][col]=array[i]; col++; if((i%5 == 0) && (i != 0) && (i != 40)){row++;col = 0;}}

2008-01-25 23:25:18 補充:
你這個問題中, 最麻煩的是中間的行數全少了一個座位, 導致這個陣列出現了多餘的位置, 這是一個難搞的情形. 如果可以話, 用 struct 來處理會比較好.(呀... 補充限字數太嚴格了. 想多打一些也不能.)
2008-01-27 1:34 pm
The previous answer has a good approach, namely by shuffling. Put the 42 numbers in order, and shuffle the table just like what you would do with a pack of cards. The first part of the program randtab.c does just that.
Then there is another approach, namely to fill the number 1 to 42 in random positions. If the position is already filled, it will randomly look for another one until an empty space is found. This is the second part of the program randtab.c.
I am reproducing the program below, but because of Yahoo's dislike for special characters, it may not show up much better than your program. Hence the above links will let you get a text version of the program that you can compile and run.
Look for the question id at this link : http://hk.knowledge.yahoo.com/question/?qid=7008012502281

Here is the code, if printed properly:

/* randtab.c
http://hk.knowledge.yahoo.com/question/?qid=7008012502281
create 6x7 random table ranging from 1 to 42
*/
#include < stdio.h>
#include < stdlib.h>
#define ROW 7
#define COL 6
void printNum(int a[ROW][COL], char *msg)
{
int i,j;
printf("%s\n",msg);
for(i=0;i< ROW;i++)
{
for(j=0;j< COL;j++)printf("%d ",a[i][j]);
printf("\n");
}
}
int main(int argc, char *argv[])
{
int nShuffle=1000;
int i,j,k,tmp,i1,j1;
int a[ROW][COL];
// by swapping
srand(time(NULL));
k=0;
for(i=0;i< ROW;i++)for(j=0;j< COL;j++){k++;a[i][j]=k;}// initialize to 1-42
for(k=0;k< nShuffle;k++)
{
i=rand()%RO; j=rand()%COL;
i1=rand()%ROW; j1=rand()%COL;
tmp=a[i][j]; a[i][j]=a[i1][j1]; a[i1][j1]=tmp;
}
printNum(a,"Random seating plan by shuffling");
// by random filling
srand(time(NULL));
for(i=0;i< ROW;i++)for(j=0;j< COL;j++){a[i][j]=0;} // initialize to zero
for(i=0;i< ROW;i++)for(j=0;j< COL;j++)
{
do{
i1=rand()%ROW; j1=rand()%COL;
if(a[i1][j1]==0){
a[i1][j1]=i*COL+j+1;
break;
}
}while(1==1); // repeat until number is filled
}
printNum(a,"Random seating plan by random filling");
return 0;
}

2008-01-27 05:42:54 補充:
Sample output:Random seating plan by shuffling1 6 38 15 40 2511 31 33 29 2 2036 5 10 23 39 3527 4 16 7 13 1812 32 28 22 3 1924 26 34 17 14 98 30 42 41 21 37Random seating plan by random filling42 11 26 38 25 4118 28 35 6 30 3212 15 22 1 7 1737 13 36 27 8 9...


收錄日期: 2021-04-13 15:02:02
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20080125000051KK02281

檢視 Wayback Machine 備份