2012-08-12 10 views
0

我的目標是生成一個程序,它可以從用戶(srand)中獲取一個隨機數,然後將其提供給一個隨機數生成器(rand),然後再選擇1到10之間的1000次隨機數。輸出每個數字有多少(即7出現83次,等等)。如何只傳遞1000個隨機數字1-10,scanf,以便我可以輸出每個出現的次數有多少?

我能夠從用戶的第一位數字後隨機打印1到10之間的1000個數字,但無法弄清楚如何獲取這個輸出並將其輸入到一個數組中,然後這個數組可以用來中斷放下打印的信息。任何人都可以幫忙嗎?

#include <stdio.h> 
#include <stdlib.h> 

int rand1(void); 
void srand1(unsigned int seed); 

int main() 

{ 
    int rand_array[1000]; 
    int count; 
    int start=1; 
    int end=10; 
    int number_var; 
    int ones=0; 
    int twos=0; 
    int threes=0; 
    int fours=0; 
    int fives=0; 
    int sixes=0; 
    int sevens=0; 
    int eights=0; 
    int nines=0; 
    int tens=0; 
    int frequency[11]; 
    int i=0; 


    unsigned seed; 



    printf("Please enter your choice for seed.\n"); 
    printf("(between 1-10)"); 

    while (scanf("%u", &seed) == 1) 

    { 
     srand1(seed); 



     for(i=0; i < 1000; i++) 
     { 
      rand_array[i]=rand1()%(end-start+1)+start; 
      frequency[rand_array[i]]++; 
     } 

     for(i = 1; i < 11; i++) 
     { 
      printf("There are %d %d's\n", frequency[i], i); 
     } 


    } 


    return 0; 

} 





int rand1(void) 

{ 
    static unsigned long int next = 1; 

    next = next * 1103515245 + 12345; 
    return (unsigned int) (next/65536) % 32768; 
} 




void srand1(unsigned int seed) 

{ 
    static unsigned long int next = 1; 
    next = seed; 
} 
+0

聲明'* rand_array = rand1()%(end-start + 1)+ start;'只爲'rand_array'的第一個值賦值隨機數。你應該使用'rand_array [count]'。此外,第二次調用'scanf'(或者'printf')不是for循環的一部分。 – 2012-08-12 23:02:20

+0

和第一個scanf是在一個while循環出於某種原因 – Gir 2012-08-12 23:03:53

+0

我同意,但* rand_array = rand1()%(end-start + 1)+ start;確實允許以下打印語句輸出1000個數字。編譯並運行時,屏幕上會顯示1到10之間的1000個隨機數字。我只是不知道如何利用輸出,因此它可以進行排序和/或分析...... – user1593866 2012-08-12 23:10:57

回答

4

您可以有一個大小爲10(或11)的數組,類型爲integer,其中每個插槽表示生成該數字的次數。例如,槽3將代表您生成一個3.因此,嘗試這個次數:

//declare array to hold frequencies 
int frequency[11]; 

//reset all slots to 0 
for(int i = 1; i < 11; i++) 
{ 
    frequency[i] = 0; 
} 

//for each random number, increment the associated slot in the frequency array 
for(int i = 0; i < 1000; i++) 
{ 
    frequency[rand_array[i]]++; 
} 

//print the results 
for(int i = 1; i < 11; i++) 
{ 
    printf("There are %d %d's\n", frequency[i], i); 
} 

注:我真的不經過您現有的大多數代碼的閱讀,所以我不知道你是否有任何其他問題。

編輯:這是一般想法的一個例子。

說你有一些隨機數字:

5, 2, 4, 9, 9, 2, 1, 10 

frequency陣列開始於0:

[0,0,0,0,0,0,0,0,0,0] 

所以現在我們遍歷您的隨機數,並增加相應的插槽。

例如,我們讀5,現在我們的頻率數組是:

[0,0,0,0,1,0,0,0,0,0] 

然後2:

[0,1,0,0,1,0,0,0,0,0] 

然後,4:

[0,1,0,1,1,0,0,0,0,0] 

然後9 :

[0,1,0,1,1,0,0,0,1,0] 

再次

[0,1,0,1,1,0,0,0,2,0] 

底:

[1,2,0,1,1,0,0,0,2,1] 

現在我們知道有多少每個號碼也有!假設我們想知道有多少個9,我們只看第9個槽,我們看到其中有2個。

這是否更有意義?這比每個數字有10個單獨的變量要好得多,然後說「如果數字是1,增加我的1s變量,如果它是2,則增加2s變量」。此外,如果您擁有1到100之間的隨機數而不是1-10,那麼調整代碼會更容易。

+0

所以你的意思是,有十個數組,每個可能的數字都有一個,併爲每個數字複製上面的數組? – user1593866 2012-08-12 23:12:21

+1

我懷疑你需要十個數組,如果你不打算存儲結果,但只需要打印出來。您可以在後續運行中重複使用'frequency'數組。 – 2012-08-12 23:15:09

+0

我已經按照建議添加了代碼,但我不確定它具體做了什麼,同樣重要的是,它爲什麼現在在編譯和運行後崩潰... – user1593866 2012-08-12 23:29:25

相關問題