सी

2008-12-31 1 views
6

में एक स्ट्रिंग को यादृच्छिक करें। मैं सी में 80-वर्णित निश्चित स्ट्रिंग के यादृच्छिक क्रमपरिवर्तन उत्पन्न करने की कोशिश कर रहा हूं। मेरी निराशा के लिए, जिस प्रणाली पर मैं काम कर रहा हूं, वह स्ट्रफ() की कमी है। इस स्ट्रिंग के यादृच्छिक क्रमपरिवर्तन उत्पन्न करने के लिए मेरे लिए सबसे अच्छा तरीका क्या है? चूंकि यह लगभग खत्म हो जाएगा। 100,000 बार, प्रदर्शन एक मुद्दा है।सी

उत्तर

13

बस ओपन सोर्स जीएलबीबी कार्यान्वयन का उपयोग करें, जैसा कि Google Code द्वारा पाया गया है।

char * 
strfry (char *string) 
{ 
    static int init; 
    static struct random_data rdata; 
    size_t len, i; 

    if (!init) 
    { 
     static int state[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
     rdata.state = NULL; 
     __initstate_r (time ((time_t *) NULL), state, 8, &rdata); 
     init = 1; 
    } 

    len = strlen (string); 
    for (i = 0; i < len; ++i) 
    { 
     int32_t j; 
     char c; 

     __random_r (&rdata, &j); 
     j %= len; 

     c = string[i]; 
     string[i] = string[j]; 
     string[j] = c; 
    } 

    return string; 
} 

आप जीएलबीबीसी विशिष्ट डेटा प्रकारों को कुछ और सामान्य में बदलना चाहते हैं।

यह कोड Fisher-Yates shuffle का उपयोग करता है जो वास्तव में आपके द्वारा कार्यान्वित करने में काफी आसान है, और बहुत ही कुशल है।

+1

आप मालिकाना शब्द बदलना चाहते हैं, अन्यथा स्टॉलमैन आपको अपने कटाण के साथ ले जा सकता है। एक उचित विकल्प जीएलबीबीसी विशिष्ट हो सकता है। –

+0

कोनराड, आप एक सज्जन और विद्वान हैं! मैंने Google Code को खोजने का प्रयास किया, लेकिन मैं बस 'स्ट्रफरी' की बजाय 'सी स्ट्रिंग में एक स्ट्रिंग को यादृच्छिक' जैसी चीजों की तलाश में था। धन्यवाद! – Max

+0

@ विंको: बहुत सच है। ;-) –

-2

शून्य gcry_randomize (अहस्ताक्षरित चार * बफर, size_t लंबाई, enum gcry_random_level स्तर) लंबाई यादृच्छिक एक यादृच्छिक गुणवत्ता के रूप में स्तर के द्वारा परिभाषित का उपयोग कर बाइट्स के साथ

भरण बफर।

http://www.g10code.com/p-libgcrypt.html

+0

एक स्वामित्व समारोह होने के अलावा, जो मुझे डर है, मैंने यह निर्दिष्ट नहीं किया कि मैं इससे बचना चाहता हूं, यह वास्तव में मेरे उद्देश्य के अनुरूप नहीं है। मैं एक मौजूदा स्ट्रिंग का एक यादृच्छिक क्रमपरिवर्तन उत्पन्न करने की कोशिश कर रहा हूं - एक यादृच्छिक स्ट्रिंग नहीं। चरित्र आवृत्ति महत्वपूर्ण है। – Max

0

एक 80-लाइन सरणी बनाने के लिए,, सरणी के प्रत्येक लाइन में एक चरित्र और एक यादृच्छिक संख्या डाल तो यादृच्छिक संख्या पर सरणी सॉर्ट।

क्रमबद्ध सरणी से स्ट्रिंग पुनर्निर्माण करें।