用C

2011-04-07 26 views
-1

我在寫我自己的方法隨機數生成用C隨機數如下:用C

int randomNumber(){ 
    int catch = *pCOUNTER; 
    int temp = catch; 
    temp /= 10; 
    temp *= 10; 
    return (catch - temp); 
} 

pCounter基本上是一個指針,在我使用的設備寄存器。該註冊號碼一直在增加,所以我的想法是隻取第一位數字。

在某些時候,返回的數量變得大於9,我不知道問題出在我的代碼或設備本身。該器件是Altera DE1板。

任何人都可以請幫忙嗎?

謝謝!

+0

我希望這是一個家庭作業。 – 2011-04-07 23:29:43

+2

你需要小心你的整數符號。如果'* pCOUNTER'是否定的,那麼到目前爲止您的方法和所有其他建議都會產生錯誤答案。如果將一個負整數轉換爲無符號類型,則它看起來很大。 – rlibby 2011-04-07 23:38:26

+0

請注意,如果'* pCOUNTER'是無符號的,則當'* pCOUNTER> = 2^32'時可以返回負值。 – user470379 2011-04-07 23:41:34

回答

1

要達到你想在你的代碼做什麼:

int catch = *pCOUNTER; 
return (catch % 10); // Returns only the ones digit 

不過,我的問題,如果這種做法是任何接近以合理隨機...

+3

被公平的擲骰子選中。保證是隨機的。 – user470379 2011-04-07 23:34:47

1

你確定你不希望使用的%=不是/ = & * =?

+0

我的邏輯是:如果catch爲1234,那麼temp/= 10爲123,temp * = 10爲1230因此(catch - temp)= 1234 - 1230 = 4. – Sadiq 2011-04-07 23:32:54

+0

好極了,對於一個輸入來說「起作用」。如果輸入是「2」呢? – 2011-04-07 23:33:31

+1

@Tomalak:'2 - 0'仍然是'2'。 – pmg 2011-04-07 23:35:12

-1

如果你要的結果武斷地限制爲9:

return (catch - temp)%10; 

我建議使用宏常量抽象出「10」,雖然,否則這是一個神奇的數字。

0

如果你正在尋找對於隨機數字(僅限0-9),請嘗試對您的方法進行修改。

int randomNumber(){ 
    return ((*pCOUNTER) % 10); 
} 

雖然這不是很隨意。如果它一直在增加,大概是已知的速率,那麼它是100%可預測的,而不是隨機的。

不允許對Altera的板rand()功能?

編輯:

你總是可以寫自己的PRNG。我做了一個Google搜索「簡單的隨機數發生器代碼」,並找到了幾個簡單的例子。最簡單的是這些線路:

int randomNumber() 
{ 
    static long a = SomeSeedValue; 

    a = (a * SomeNumber + AnotherNumber) % SomeLargePrimeNumber; 
    return a % 65536; 
} 
+0

是的,我想這比「隨機」更「隨意」。 – 2011-04-07 23:34:12

3

您是否聲明pCounter爲易失性?

volatile unsigned *pCounter = (unsigned *)0xBADDECAF; 

int randomNumber(){ 
    return *pCounter % 10; 
} 
+0

+1'volatile'和'%10' – 2011-04-07 23:45:11

+0

請注意,即使它_is_標誌着揮發性,許多編譯器是臭名昭著的總是不正確地處理volatile變量:看http://www.cs.utah.edu/~regehr/論文/ emsoft08-preprint.pdf進行有趣的閱讀。 – user470379 2011-04-07 23:46:09

1

我懷疑你的問題可能是由編譯器推出了「優化」 - 如果你沒有用正確的波動性聲明pCOUNTER,編譯器可以通過指針讀數超過一次。我不知道你的處理器可能有多少個寄存器 - 如果沒有足夠的空間來保存寄存器中的catch,它可能會多次讀取它(一次獲取某些內容執行temp計算,並且再次讀取最終返回值)。

嘗試以下,應確保pCOUNTER設備/讀寄存器只有一次:

int randomNumber(){ 
    int catch = *(int volatile*)pCOUNTER; 
    int temp = catch; 
    temp /= 10; 
    temp *= 10; 
    return (catch - temp); 
} 
+0

+1解釋爲什麼揮發性物質的解釋。 – 2011-04-07 23:46:11