यहाँ फिशर-येट्स के एक सी कार्यान्वयन है कि मैं एक डेक फेरबदल दिनचर्या में उपयोग करने के लिए चाहते हैं। क्या मैं इसे सही ढंग से कर रहा हूं (एन = सरणी की लंबाई)?क्या यह सी फिशर-येट्स का कार्यान्वयन सही है?
नोट: do-जबकि पाश सापेक्ष पूर्वाग्रह के लिए सही करने के लिए प्रयास करता है (here देखें)। यह प्रक्रिया के लिए थोड़ा अधिक ओवरहेड जोड़ता है और यदि आप निम्न-बिट पूर्वाग्रहों की परवाह नहीं करते हैं तो इसे समाप्त किया जा सकता है।
void shuffle(int *array, int n) {
int i, j, tmp, upper_bound;
srand(time(NULL));
for (i = n - 1; i > 0; i--) {
upper_bound = RAND_MAX - ((RAND_MAX % (i + 1)) + 1);
do {
j = rand() % (i + 1);
} while (j > upper_bound);
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}
यह सिर्फ मेरे सिर में आया कि 'int lim = rAND_MAX-i;' ... '} जबकि (j> upper_bound && --lim);' _it_ _can_ _never_ _happen_ केस को पकड़ने का एक उपयुक्त तरीका हो सकता है यादृच्छिक संख्या रेंज से बाहर दोहराया। बीजिंग पर टिप्पणी के लिए – nategoose