2008-12-04 9 views
7

मैं अगर यह अगर मैं इस राशि कुछ संख्या के औसत की गणना करना संभव है सोच रहा था:क्या मैं इन संख्याओं के औसत की गणना कर सकता हूं?

int currentCount = 12; 
float currentScore = 6.1123 (this is a range of 1 <-> 10). 

अब, अगर मैं एक और स्कोर प्राप्त (मान लीजिए कि 4.5 है), मैं औसत पुनर्गणना कर सकते हैं तो यह कुछ होगा जैसे:

int currentCount now equals 13 
float currentScore now equals ????? 

या यह असंभव है और मुझे अभी भी स्कोर की सूची याद रखने की आवश्यकता है?

उत्तर

20

निम्नलिखित सूत्र आपको अनुरोध किए गए औसत औसत और गणना से औसत ट्रैक करने की अनुमति देते हैं।

currentScore = (currentScore * currentCount + newValue)/(currentCount + 1) 
currentCount = currentCount + 1 

यह इस तथ्य पर निर्भर करता है कि आपका औसत वर्तमान में आपकी राशि गिनती से विभाजित है। इसलिए आप योग प्राप्त करने के लिए औसत से गिनती गुणा करते हैं, अपना नया मान जोड़ते हैं और विभाजित करते हैं (गिनती + 1), फिर गिनती बढ़ाएं।

तो, मान लें कि आपके पास डेटा {7,9,11,1,12} है और केवल एक चीज जो आप रख रहे हैं औसत और गिनती है। प्रत्येक संख्या के रूप में जोड़ा जाता है, आपको मिलता है:

+--------+-------+----------------------+----------------------+ 
| Number | Count | Actual average  | Calculated average | 
+--------+-------+----------------------+----------------------+ 
|  7 |  1 | (7)/1   = 7 | (0 * 0 + 7)/1 = 7 | 
|  9 |  2 | (7+9)/2   = 8 | (7 * 1 + 9)/2 = 8 | 
|  11 |  3 | (7+9+11)/3  = 9 | (8 * 2 + 11)/3 = 9 | 
|  1 |  4 | (7+9+11+1)/4 = 7 | (9 * 3 + 1)/4 = 7 | 
|  12 |  5 | (7+9+11+1+12)/5 = 8 | (7 * 4 + 12)/5 = 8 | 
+--------+-------+----------------------+----------------------+ 
+0

यह वर्तमान नहीं होना चाहिए सिकोर = (वर्तमानस्कोर * वर्तमान गणना + 4.5)/(वर्तमान गणना + 1) –

+0

धन्यवाद, @ जॉन, सीधे सोच नहीं रहा था। – paxdiablo

+0

कोई चिंता नहीं, –

16

मुझे योग और गिनती स्टोर करना पसंद है। यह प्रत्येक बार एक अतिरिक्त गुणा से बचाता है।

current_sum += input; 
current_count++; 
current_average = current_sum/current_count; 
+1

राशि को बनाए रखने, खासकर यदि आप औसत स्थगित कर सकते हैं जब तक आप सभी नंबरों को अभिव्यक्त के बारे में एक अच्छा बात है कि। – paxdiablo

+0

लेकिन हमें इसे पारस्परिक प्रशंसा समाज में नहीं बदलना चाहिए :-) – paxdiablo

+0

बिल्कुल; सामान्य रूप से आप शक्तियों की मात्रा के साथ nth पल की गणना कर सकते हैं। उदाहरण के लिए, आप std.dev की गणना कर सकते हैं। वर्गों, रकम, और गिनती के साथ। हालांकि, अगर आपको स्ट्रीमिंग एसडी की आवश्यकता है। देव। ऐसा मत करो, ऐसा करें: http://www.cs.berkeley.edu/~mhoemmen/cs194-fall2007/Tutorials/variance.pdf –

2

आप वर्तमान काउंटर और sumScore स्टोर कर सकते हैं और आप sumScore/currentCount की गणना कर सकते हैं।

1

नाव currentScore अब बराबर होती है (currentScore * (CURRENTCOUNT -1) + 4.5)/CURRENTCOUNT?

3

जब आप औसत के सूत्र को देखते हैं तो यह काफी आसान है: A1 + A2 + ... + AN/N। अब, आप पुराने औसत और एन है (संख्या गिनती) आप आसानी से नए औसत की गणना कर सकते हैं:

newScore = (currentScore * currentCount + someNewValue)/(currentCount + 1) 
2

या ... यदि आप मूर्ख होना चाहते हैं, तो आप इसे एक पंक्ति में कर सकते हैं:

current_average = (current_sum = current_sum + newValue)/++current_count; 

:)

+0

यदि मैं ++ current_count बनाम current_count ++ करता हूं तो क्या इससे कोई फर्क पड़ता है ?? –

+0

हां। वर्तमान_एवरेज की गणना करने से पहले एक increments current_count, दूसरा इसके बाद करता है। – slim

+0

तो ++ current_count increments विभाजन से पहले, wile current_count ++ विभाजन के बाद बढ़ाया गया है? आउच! बस कोड को देखकर, मैंने सोचा होगा कि यह होता ... "और बाएं तरफ दाएं तरफ से विभाजित करें (वर्तमान गिनती + 1)। खुशी है मैंने पूछा! –

संबंधित मुद्दे