2009-12-17 155 views
0

感謝所有幫助過我。 但我仍然有關於該計劃的一些問題。 如何生成一個新的隨機數,而新的隨機數等於先前的隨機數?另外如何轉置矩陣?如何生成一個新的隨機數並轉置矩陣?

#include "stdafx.h" 
#include "stdlib.h" 
#include "time.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int num2 = 0; 
    int num=0, i, j;  
    int mtx[9][9] = {0}; 

    while (num < 3 || num > 9) { 
     printf("Enter an integer (3-9): "); 
     scanf("%d", &num); 
    } 
do 
{ 
    srand(time(NULL)); 

    switch (num) 
    { 
    case 3: num2 = rand() % 8; 
     break; 
    case 4: num2 = rand() % 15; 
     break; 
    case 5: num2 = rand() % 24; 
     break; 
    case 6: num2 = rand() % 35; 
     break; 
    case 7: num2 = rand() % 48; 
     break; 
    case 8: num2 = rand() % 63; 
     break; 
    case 9: num2 = rand() % 80; 
     break; 
    } 


    for (i=0; i < num; ++i) 
     for (j=0; j < num; ++j) 
      mtx[i][j] = num2; 
} 
while (num2 == num2); 



    for (i=0; i < num; ++i) { 
    for (j=0; j < num; ++j) 
     printf("%i ", mtx[i][j]); 
    printf("\n"); 
} 



    return 0; 
} 

更新:

#include "stdafx.h" 
#include "stdlib.h" 
#include "time.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int prevNum2 = 0; 
    int num2 = 0; 
    int num = 0, i, j;  // Added initializers and loop counters 
    int mtx[9][9] = {0}; // Reserve enough space for the worst-case scenario 

    while (num < 3 || num > 9) { // Added input validation loop 
     printf("Enter an integer (3-9): "); 
     scanf("%d", &num); 
    } 

    srand(time(NULL)); 

    do{ 

    prevNum2 =num2; 
    switch (num) 
    { 
    case 3: num2 = rand() % 8; 
     break; 
    case 4: num2 = rand() % 15; 
     break; 
    case 5: num2 = rand() % 24; 
     break; 
    case 6: num2 = rand() % 35; 
     break; 
    case 7: num2 = rand() % 48; 
     break; 
    case 8: num2 = rand() % 63; 
     break; 
    case 9: num2 = rand() % 80; 
     break; 

    } 




    // Loop through the matrix elements we want, filling each with a random number  
    for (i=0; i < num; ++i) 
     for (j=0; j < num; ++j) 
      mtx[i][j] = num2; 
    } 
    while (num2 == prevNum2); 

    /* Do something with the matrix here (display it, etc) */ 

    for (i=0; i < num; ++i) { 
    for (j=0; j < num; ++j) 
     printf("%i ", mtx[i][j]); 
    printf("\n"); 
} 



    return 0; 
} 
+2

將srand()移出循環。閱讀隨機數字生成中的許多問題。 – 2009-12-17 14:25:36

+0

這是做你正在做的事情的極其無效的方式。你想把所有數字從'0'分配到'n-1'('n = num * num')到'mtx'。生成範圍爲「0」到「n-1」的隨機數,然後檢查它是否尚未生成變得非常慢,因爲可用數字池變得更小。例如,當您生成80個這樣的號碼時,您知道第81號碼應該是什麼,但按照您的算法進行操作可能需要很長時間才能找到您想要的號碼。你正在尋找的是一種混合'0'和'num * num-1'之間數字的方法。 – 2009-12-18 18:24:19

回答

1

我想你應該改變這一行:

while (num2 == num2); 

由於這將無限期地繼續下去了NUM2的任何值

編輯:

這裏做我的評論cleaerer是編程位,使其工作:

do 
{ 
    srand(time(NULL)); 

    switch (num) 

變爲:

do 
{ 
    int prevNum2 =num2; 
    switch(num) 

and

while (num2 == num2); 

變爲:

while(num2 == prevNum2); 

最後編輯:

到您編輯的響應。這一點的代碼顯然不是你想要的:

for (i=0; i < num; ++i) 
    for (j=0; j < num; ++j) 
     mtx[i][j] = num2; 
} 

它所做的是用相同的數字填充整個矩陣。

你真正想要的(可能)是每一個下一個單元格填充不同的數字。 爲此,您需要具有某種類型的循環結構。

線沿線的東西:

for(int i; i<num*num; i++) 
{ 
     //draw random number bit (shortened for clearity... should be your whole switch bit) 
     num2 = rand() % 8; 

     mtx[i%num][i/num] = num2; 
} 

完蛋了......這樣整個矩陣被填滿隨機值。無需檢查該值是否已經繪製過...因爲這是沒有問題的

+0

我認爲這個陳述也是錯誤的,但我怎麼能糾正它? 我想表示「while(new ranNum == previos ranNum);」 – 2009-12-17 14:48:12

+0

完全按照您剛剛鍵入的方式進行操作。開關類型之前:int prevNum2 = num2; ...和while成爲:while(num2 == prevNum2) – Toad 2009-12-17 15:11:08

+0

作爲旁註:有這樣一個條件打敗了rand()的目的。完全有可能有兩個隨機數字相同(尤其是使用如此小的數字範圍)。隨着你的病情,你有效地削弱了隨機分佈。 – Toad 2009-12-17 15:12:41

1

像尼爾說,srand()函數需要被調用一次,在節目的開頭。每次你打電話給srand時,你都會播種隨機數字發生器,但是通過這個程序它總是會被播種,所以你最終會得到相同的隨機數字。

<笑話>

當然,這是完全足夠隨機的一些定義:

XKCD

< /笑話>

+0

哦... srand()循環後仍然不工作。 – 2009-12-17 14:32:20

+0

不工作是什麼意思? – Skilldrick 2009-12-17 14:36:16

+0

輸入數字後,仍然沒有打印出來。 – 2009-12-17 14:37:30

0

做 { .. }(X == X)

是一個無限循環。你沒有任何break語句來退出這個。

2

的代碼部分,其讀取

switch (num) 
    { 
    case 3: num2 = rand() % 8; break; 
    case 4: num2 = rand() % 15; break; 
    case 5: num2 = rand() % 24; break; 
    case 6: num2 = rand() % 35; break; 
    case 7: num2 = rand() % 48; break; 
    case 8: num2 = rand() % 63; break; 
    case 9: num2 = rand() % 80; break; 
    } 

可以被重寫爲

num2 = rand() % ((num * num) - 1); 

這是更緊湊的,可以說是更清晰。

0

我想你想用獨特的隨機整數初始化元素mtx從0到n-1,其中nmtx元素的個數(不mtx代表一個數獨細胞?)。如果是這種情況:

您的for循環將mtx的所有元素設置爲相同的值。所以,如果你想做我認爲的事情,那在任何情況下都是行不通的。

你想要做的是從0n-1洗牌的數字列表。 Fisher-Yates shuffle非常簡單高效。

如果你不想處理malloc和朋友,這裏有一個方法可以做到這一點。

/* maximum possible size, replace ... with actual numbers */ 
int list[] = {0,1,2,3,4,5,6,7,8,...,80}; 

/* function to shuffle the first n elements of list */ 
void shuffle(int *list, size_t n); 

然後,當你知道值num

shuffle(list, num*num); 
for (i=0; i < num; ++i) 
    for (j=0; j < num; ++j) 
     mtx[i][j] = list[i*num+j]; 

,你可以擺脫所有的代碼處理隨機數,你do...while循環等

我沒有爲你而寫shuffle(),監守我認爲這將是一個有趣的練習吧去做。 :-)

最後,您提示:

printf("Enter an integer (3-9): "); 

可能不會在你撥打以上printf()的時間顯示給用戶,因爲stdout線是默認情況下,許多系統緩衝。爲了確保你的程序等待輸入之前它的顯示,這樣做:

fflush(stdout); 

你嘗試讀取輸入之前。這將確保提示得到正確顯示。

0

我相信最簡單的方法來解決這個沒有根本性的變化是消除do-while循環。如果你想生成一個矩陣(或者對矩陣的每個元素進行任何操作 - 顯示,修改等等),最簡單的方法是在雙重嵌套的for循環中工作。你的變量'prevnum2'並不是真的需要。

for (i = 0; i < num; i++) { 
    for (j = 0; j < num; j++) { 
    switch (num) { // generate a random number 
     ... 
    } 

    mtx[i][j] = num2; // store the random number in the matrix 
    } 
} 

當你在你的編程生活中繼續往前走時,你肯定會想看看Alok對於更好的隨機數生成技術的出色建議。