2009-11-26 18 views
6

मुझे यह समस्या है जहां मुझे अपने ट्रैनस्टैक्शन का प्रतिशत "ऑडिट" करना है।रनटाइम पर प्रतिशत की गणना करें

तो प्रतिशत 100 है मैं उन सब ऑडिट करने के लिए है, तो 0 मैं उन सभी को छोड़ दिया है और अगर 50% मैं आधे की समीक्षा करनी आदि

समस्या (या अवसर) वह यह है कि मैं रनटाइम पर चेक करना है।

मैं क्या करने की कोशिश की थी:

audit = 100/percent 

तो अगर प्रतिशत 50

audit = 100/50 (which is 2) 

तो मैं 1 लेखा परीक्षा और लेखा परीक्षा 1 1 छोड़ सकते हैं और 1 को छोड़ करने के लिए है है ..

है 30

ऑडिट = 100/30 (3.3)

मैं 2 ऑडिट करता हूं और तीसरे स्थान पर जाता हूं।

प्रश्न

मैं (75%) की तरह 50% से परे संख्या के साथ समस्याओं क्योंकि यह मुझे 1.333, देता हो रही है ...

जब होगा सही एल्गोरिथ्म है कि कितने पता करने के लिए लेखापरीक्षा के रूप में वे जाते हैं? ... मुझे 0 के साथ समस्याएं भी हैं (0 से विभाजित होने के कारण: पी) लेकिन मैंने पहले से ही तय किया है, और 100 आदि के साथ

किसी भी सुझाव की बहुत सराहना की जाती है।

+1

सबसे पहले देखते हैं? या क्या सभी लेन-देन सूची के प्रमुख से आ सकते हैं (उदाहरण के लिए, यदि आपको 30% का ऑडिट करना है, तो क्या आप लेनदेन के पहले 30% का ऑडिट कर सकते हैं? – inspectorG4dget

+0

number_of_items = (प्रतिशत) * (total_number_of_items) जहां प्रतिशत है [0,1] (इसलिए, यदि आपके पास [0,100] है, तो 100 से विभाजित करें) – Thanatos

+0

सामान्य लेखापरीक्षा में यादृच्छिक होना चाहिए। आपका एल्गोरिदम यादृच्छिक नहीं है और आसानी से घुमाया जा सकता है। यदि आप इसे वित्तीय सेटिंग में उपयोग कर रहे हैं तो आपको अपने एल्गोरिदम को समायोजित करें। – jabbie

उत्तर

17

यह यादृच्छिक रूप से क्यों नहीं करता है। प्रत्येक लेनदेन के लिए, 0 और 100 के बीच एक यादृच्छिक संख्या चुनें। यदि वह संख्या आपके "प्रतिशत" से कम है, तो लेनदेन का ऑडिट करें। यदि संख्या आपके "प्रतिशत" से अधिक है, तो नहीं। मुझे नहीं पता कि यह आपकी आवश्यकताओं को पूरा करता है, लेकिन एक विस्तृत अवधि के दौरान, आपके पास सही प्रतिशत ऑडिट किया जाएगा।

यदि आपको सटीक "स्किप 2, ऑडिट एक, 2 ऑडिट एक टाइप करें" एल्गोरिदम की आवश्यकता है, तो आपको line-drawing algorithm का अनुकूलन करने की उम्मीद है।

+0

+1। मुझे 5 सेकंड – RickNZ

+0

तक इसे हराया गया है ... मैं एक त्वरित परीक्षण करूँगा ..... – Sony

+2

+1, यह आपको कई कारणों से करना चाहिए। बस पीएचबी को यह न बताएं कि ससुराल की लेखा परीक्षा प्रक्रिया को मौका दिया जा रहा है ... वह उसे पसंद नहीं कर सकता है। –

3

इस प्रयास करें:

1) एक दशमलव के रूप में अपने लेखा परीक्षा प्रतिशत रखें।
2) प्रत्येक लेनदेन के लिए,
3 के साथ यादृच्छिक संख्या (0 और 1 के बीच) को संबद्ध करें 3) यदि यादृच्छिक संख्या प्रतिशत से कम है, तो लेनदेन का ऑडिट करें।

1

यदि आपको वास्तविक समय में इन लेन-देन का ऑडिट करने की आवश्यकता है (जैसा कि उन्हें प्राप्त होता है) तो आप यह जांचने के लिए यादृच्छिक संख्या जेनरेटर का उपयोग कर सकते हैं कि आपको लेनदेन का ऑडिट करने की आवश्यकता है या नहीं।

तो यदि उदाहरण के लिए आप 50% लेनदेन का ऑडिट करना चाहते हैं, तो प्रत्येक लेनदेन के लिए आप 0 और 1 के बीच यादृच्छिक संख्या उत्पन्न करेंगे, और यदि संख्या 0.5 से अधिक थी, तो लेनदेन का लेखा परीक्षा करें।

जबकि कम संख्या के लिए यह काम नहीं करेगा, बड़ी संख्या में लेनदेन के लिए यह आपको आवश्यक प्रतिशत के बहुत करीब देगा।

यह आपके शुरुआती सुझाव से बेहतर है क्योंकि यदि ऑडिट प्रक्रिया को 'गेम' करने की विधि की अनुमति नहीं है - यदि आप हर दूसरे लेनदेन का ऑडिट कर रहे हैं तो इससे खराब लेन-देन की अनुमति मिलती है।

एक और संभावना कुल लेनदेन की कुल संख्या को बनाए रखना है और इससे लेनदेन की कुल संख्या में परिवर्तन किया जाना चाहिए (आपके प्रतिशत के अनुसार) आप ऑडिटिंग प्रक्रिया में पाइप लेनदेन कर सकते हैं। हालांकि यह अभी भी पैटर्न का पता लगाने और लेखापरीक्षा को रोकने की थोड़ी संभावना खुलता है।

1

एक उच्च थ्रूपुट सिस्टम के लिए यादृच्छिक विधि सर्वोत्तम है, लेकिन यदि आप यादृच्छिकता नहीं चाहते हैं, तो यह एल्गोरिदम नौकरी करेगा। एक इकाई परीक्षण में परीक्षण करने के लिए मत भूलना!

// setup 
int transactionCount = 0; 
int auditCount = 0; 
double targetAuditRatio = auditPercent/100.0; 

// start of processing 
transactionCount++; 
double actualAuditRatio = auditCount/transactionCount; 

if (actualAuditRatio < targetAuditRatio) { 
    auditCount++; 
    // do audit 
} 
// do processing 
0

आप लगातार काउंटर का उपयोग करके प्रत्येक लेखापरीक्षा "क्वेरी" कर सकते हैं। उदाहरण

लिए
ctr = 0; 
percent = 50 
while(1) { 
    ctr += percent; 
    if (ctr >= 100) { 
     audit; 
     ctr = ctr - 100; 
    } else 
     skip 
} 

आप तैरता उपयोग कर सकते हैं (हालांकि यह कुछ अनिश्चितता लाएगा) या sth द्वारा 100 प्रतिशत गुणा बेहतर संकल्प प्राप्त करने के लिए।

यादृच्छिक संख्या जनरेटर का उपयोग करने की वास्तव में कोई आवश्यकता नहीं है।

2
if percent > random.randint(1,100): 
     print("audit") 
    else: 
     print("skip") 
2

अपने स्वयं के एल्गोरिदम का पालन करने के लिए: बस उस 1.333333 (या अन्य उद्धरण) को काउंटर पर जोड़ना जारी रखें।

दो काउंटर हैं: एक पूर्णांक एक और एक असली। वास्तविक काउंटर = पूर्णांक काउंटर के छोटा हिस्सा, ऑडिट किया जाता है तो, अन्यथा यह नहीं है, इस तरह:

Integer counter Real counter 

1     1.333333: audit transaction 
2     2.666666: audit transaction 
3     3.999999: audit transaction 
4     truncated(5.333333) = 5 > 4 => do NOT audit transaction 
5     5.333333: audit transaction 

केवल वास्तविक काउंटर बढ़ाने के जब इसकी छोटा संस्करण = पूर्णांक काउंटर। हमेशा पूर्णांक काउंटर बढ़ाएं।

कोड में:

var p, pc: double; 
    c: integer; 
begin 
    p := 100/Percentage; 
    pc := p; 
    for c := 1 to NrOfTransactions do begin 
    if trunc(pc) = c then begin 
     pc := pc + p; 
     Do audit on transaction c 
    end 
    end; 
end; 
0

जांची नहीं है, लेकिन random मॉड्यूल में एक समारोह sample है। यदि transactions लेनदेन की एक सूची थी, आप की तरह कुछ करना होगा:

import random 

to_be_audited = random.sample(transactions,len(transactions*100/percentage)) 

यह एक सूची to_be_audited जो एक यादृच्छिक, लेन-देन की गैर डुप्लिकेट नमूना होगा उत्पन्न होगा।

, अपने "लेखा परीक्षा में 30%" उदाहरण के लिए, आप लेखा परीक्षा 33% सभी लेनदेन आप लेखा परीक्षा समान रूप से होना आवश्यक है खत्म हो जाएगा documentation on random

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