MySQL छद्म यादृच्छिक संख्या जनरेटर पूरी तरह से नियतात्मक है। दस्तावेज़ कहते हैं:
यह /dev/random का उपयोग नहीं कर सकता क्योंकि MySQL को विभिन्न प्रकार के ऑपरेटिंग सिस्टम पर काम करने के लिए डिज़ाइन किया गया है, जिनमें से कुछ में /dev/random नहीं है।
MySQL time(0)
. द्वारा लौटाए गए पूर्णांक का उपयोग करके सर्वर स्टार्टअप पर एक डिफ़ॉल्ट बीज प्रारंभ करता है .यदि आप स्रोत लाइन में रुचि रखते हैं, तो यह फ़ाइल sql/mysqld.cc में MySQL स्रोत में है, फ़ंक्शन init_server_components()
. मुझे नहीं लगता कि यह कभी खुद को फिर से बोता है।
फिर बाद की "यादृच्छिक" संख्याएं पूरी तरह से बीज पर आधारित होती हैं। स्रोत फ़ाइल देखें mysys_ssl/my_rnd.cc, फ़ंक्शन my_rnd()
।
आपके रैंडम-चयन कार्य का सबसे अच्छा अभ्यास समाधान, प्रदर्शन और रैंडमाइजेशन की गुणवत्ता दोनों के लिए, न्यूनतम प्राथमिक कुंजी मान और अधिकतम प्राथमिक कुंजी मान के बीच एक यादृच्छिक मान उत्पन्न करना है। फिर अपनी तालिका में प्राथमिक कुंजी चुनने के लिए उस यादृच्छिक मान का उपयोग करें:
SELECT ... FROM MyTable WHERE id > $random LIMIT 1
आपके द्वारा उपयोग किए जाने का कारण =के बजाय यह है कि पंक्तियों को हटाए जाने या वापस लुढ़कने के कारण आपके आईडी में अंतराल हो सकते हैं, या आपके WHERE क्लॉज में अन्य शर्तें हो सकती हैं ताकि आपके पास अपनी शर्तों से मेल खाने वाली पंक्तियों के बीच अंतराल हो ।
इस विधि से अधिक के नुकसान:
- ऐसे अंतराल के बाद वाली पंक्तियों में चुने जाने की संभावना अधिक होती है, और अंतराल जितना बड़ा होता है, संभावना उतनी ही अधिक होती है।
- यादृच्छिक मान उत्पन्न करने से पहले आपको MIN(id) और MAX(id) जानना होगा।
- यदि आपको एक से अधिक यादृच्छिक पंक्ति की आवश्यकता है तो भी यह काम नहीं करता है।
इस विधि के लाभ:
- यह ORDER BY RAND() की तुलना में बहुत तेज़ है, यहाँ तक कि मामूली टेबल आकार के लिए भी।
- आप SQL के बाहर किसी रैंडम फ़ंक्शन का उपयोग कर सकते हैं।